c++位運算

前言

今天準備寫一下關於位運算的東西。html

其實位運算並無什麼難點,也沒有什麼太多的內容。c++

啥也不說了,下面就直接進入文章正文。學習

初識位運算

程序中的全部數在計算機內存中都是以二進制的形式儲存的。位運算就是直接對整數在內存中的二進制位進行.spa

這就是位運算的概念,不難理解吧。htm

位運算符號

含義 Pascal語言 C/C++語言 Java
按位與 a and b a & b a & b
按位或 a or b a | b a | b
按位異或 a xor b a ^ b a ^ b
按位取反 not a ~a ~a
左移 a shl b a << b a << b
帶符號右移 a shr b a >> b a >> b
無符號右移 / / a>>> b

這裏各類語言都寫在這裏了。要用的話就那去吧。內存

下面說一說位運算符號的具體做用ci

符號使用方法

按位與

按位與,在c++的表示中爲 &get

位運算其實只有一種狀況,用豎式兩位對齊計算。下面是運算結果:數學

0 & 0 = 0it

0 & 1 = 0

1 & 0 = 0

1 & 1 = 1

也就是隻有當兩個數都是1的時候,按位與的結果纔是1

按位或

按位或,在c++的表示中爲 |

或運算的四種狀況以下:

0 | 0 = 0

1 | 0 = 1

0 | 1 = 1

1 | 1 = 1

按位或就是隻要兩個數中有一個1的時候,按位或的結果就是1

按位異或(xor)

按位異或,在c++的表示中爲^(不是乘方,我在剛學習c++是傻傻的認爲是乘方

按位異或的四種狀況以下:

0 ^ 0 = 0

1 ^ 0 = 1

0 ^ 1 = 1

1 ^ 1 = 0

按位異或的結果很特殊,很容易迷惑人,相同是0,不一樣是1,不過有一個比較好的計算方法,你把他當作一個不進位的加法就能夠了。

按位取反

這個彷佛用的很少,理解就好:~

1. 全部正整數的按位取反是其自己+1的負數

2. 全部負整數的按位取反是其自己+1的絕對值

3. 零的按位取反是 -1(0在數學界既不是正數也不是負數)

左移

左移符號就是cout <<

左移怎麼講呢……

就是這樣,舉個栗子:8 << 2

就是說把8轉爲2進制:1000

而後在後面添加兩個0:100000

也就是32;

其實計算這個並不難;

用數學表達就是a << n = a*2^n(這裏的^是乘方嘿嘿

右移

 右移符號就是cin >>

右移同上,就是往右移動兩位

不說了

位運算的計算技巧

統一特色

可使用交換、結合律

按位與

可使用按位與判斷奇偶數

n & 1的結果就是取n的二進制的最末位。二進制的最末位爲0表示n爲偶數,最末位爲1表示n爲奇數

有人可能會說,判斷奇偶爲何不用%2?

其實用&1的方法比%2要快一些,若是追求速度,推薦使用&1,再說打字難度也是同樣的。

按位異或

異或結果特色

1.n^n=0

2.0^n=0

異或翻轉二進制

只須要將想要反轉的位異或1就能夠, 如: 1010 ^ 1111 = 0101

左移

左移當乘號

前面說過了……

n<<a=n*2^a

右移

右移當除號

n>>a=n/2^a

實戰演練

問題1

一個奇數次

飛機場:http://www.51nod.com/Challenge/Problem.html#problemId=2106

問題2

二進制距離之和

飛機場:http://www.51nod.com/Challenge/Problem.html#problemId=2493

問題3

最優填充

飛機場:http://www.51nod.com/Challenge/Problem.html#problemId=2533

問題4

區間xor(xor表示異或)

飛機場:http://www.51nod.com/Challenge/Problem.html#problemId=2653

這個題目數據較水,正解的話仍是要考慮一下的。

 

後記

這篇文章就到這裏了。

若有問題隨時在評論區問我!


 

 

 

客官,給個贊再走唄?

相關文章
相關標籤/搜索