1.補碼
補碼是為了表示乙個負數的二進位制形式。
其轉化方式是,先將負數當成正數,轉化成二進位制的形式,再將二進位制正數的各個位上取反,再加上-。
例如-
5先求出5的二進位制數 : 0000
0000
0101
然後將各個位上0變1
,1變0 : 1111
1111
1010
最後再加1 : 1111
1111
1011
這裡5二進位制下是101表示時前面全是0,這裡省略就只寫了幾個意思一下
2.按位與(&)
x & y 是二進位制 x 和 y 的每一位分別進行「與運算」的結果。
與運算,即兩者都為 1 時才會返回 1,否則返回 0。
那麼 b & 1
二進位制b = 1011
1 = 0001
b&1 = 0001
因為 1(二進位制)的前面幾位全部都是 0,所以只有 b 二進位制最後一位是 1 時,b & 1 才會返回 1。挺巧妙的,並且很快,省時間複雜度。
例如5&-
55 : 0000
0000
0101
-5 :1111
1111
1011
答案 : 0000
0000
0001
3.按位或(|)
運算的兩個數,轉換為二進位制後,進行或(|)運算。
只要相應位上存在1,那麼該位就取1,如果都不為1,就為0。
還是5|-
50000
0000
0101
1111
1111
1011
可以看到每一位中其中乙個都有1
答案 :1111
1111
1111
4.按位異或(^)
運算的兩個數,轉換成二進位制數後,進行異或(^)運算
如果相應位置上的數相同,該位取0,如果不同改位取1。
5^-
50000
0000
0101
1111
1111
1011
答案: 1111
1111
1110
同時任何數異或0都是其本身,乙個數如果異或自己則等於0
這樣我們可以用異或來交換兩個數的值
比如交換x,y的值
x ^= y; x = x ^ y
y ^= x; y = y ^ x ^ y
x ^= y; x =
( x ^ y )
^(y ^ x ^ y);--
-------
//最後一步 x ^= y 時 x = x ^ y; y = y ^ x ^ y
5.左移(<<)右移(>>)
就是乘2和除以2,很快。
6.取反(~)
每一位取相反的數
addings
位運算可用於狀態壓縮(即我們平時說的狀壓),用0和1來表示物品的狀態。
例如:現有n個物品,我們就可以用乙個n位的二進位制數來表示每乙個物品的選取,若第i為1,表示選取第i個物品,若第i位為0,則表示不選取第i個物品。
狀態壓縮常用於搜尋和dp,是一種很暴力的方法,只有在n比較小的時候適用long long型別能存下1018的數,大概是240即n>40時,我們很可能不能直接用二進位制列舉出狀態並儲存。
參考洛谷p4289 bfs題目,使用二進位制狀壓
位運算學習筆記
要明白位運算是在二進位制中的運算方式,所有其他進製的數在進行位運算時都要先轉化成二進位制數再進行運算。int 是 32位二進位制。有符號整型 正數 0 負數 1 1 00000.0001 1 10000.00011.按位與 只有當x,y都是1的時候,運算結果才是1,其餘情況都是0.1 1 1 1 0...
位運算學習筆記
1 二進位制最高位是符號位 0代表正數,1代表負數 2 正數的原碼 反碼 補碼都相同 3 負數的反碼是將原碼符號位不變,其他位取反。4 負數的補碼是將反碼 1 5 0的原碼 補碼都是0 6 計算機中是依據補碼進行計算的。7 練習 1 2 例題說明 對2按位取反。由於2為正數,正數的原碼 補碼相等。所...
C語言位運算 學習筆記
位運算是指按二進位制位進行的運算,實際上就是直接對整數在記憶體中的二進位制位進行操作。二進位制通俗來說就是只有0和1兩個可用的數字來表示一切狀態,方便理解可以說成是一盞燈的開和關兩種狀態,狀態有何用?對計算機來說使用者輸入資料,然後顯示這個簡單的過程就需要人機互動,即使用者和計算機的溝通,也可以說是...