今天準備寫一下關於位運算的東西。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
按位異或,在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
一個奇數次
飛機場:http://www.51nod.com/Challenge/Problem.html#problemId=2106
二進制距離之和
飛機場:http://www.51nod.com/Challenge/Problem.html#problemId=2493
最優填充
飛機場:http://www.51nod.com/Challenge/Problem.html#problemId=2533
區間xor(xor表示異或)
飛機場:http://www.51nod.com/Challenge/Problem.html#problemId=2653
這個題目數據較水,正解的話仍是要考慮一下的。
這篇文章就到這裏了。
若有問題隨時在評論區問我!
客官,給個贊再走唄?