程式中的所有數在計算機記憶體中都是以二進位制的形式儲存的。位運算就是直接對整數在記憶體中的二進位制位進行操作。
and運算 &
and運算通常用於二進位制的取位操作,例如乙個數 and 1的結果就是取二進位制的最末位。這可以用來判斷乙個整數的奇偶,二進位制的最末位為0表示該數為偶數,最末位為1表示該數為奇數。
相同位的兩個數字都為1,則為1;若有乙個不為1,則為0。
如:
00101
& 11100
----------------------
00100
or運算 |
or運算通常常用於二進位制特定位上的無條件賦值,例如乙個數or 1的結果就是把二進位制最末位強行變成1。如果需要把二進位制最末位變成0,對這個數or 1之後再減一就可以了,其實際意義就是把這個數強行變成最接近的偶數。
相同位只要乙個為1即為1。
如:
00101
|11100
----------------
11101
xor運算 ^
異或的符號是^。按位異或運算, 對等長二進位制模式按位或二進位制數的每一位執行邏輯按位異或操作. 操作的結果是如果某位不同則該位為1, 否則該位為0.
xor運算的逆運算是它本身,也就是說兩次異或同乙個數最後結果不變,即(a ^ b) ^ b = a。^運算可以用於簡單的加密,比如我想對朋友說1314520,但怕別人知道,於是雙方約定拿他的生日19880516作為金鑰。1314520 ^ 19880516 = 20665500,我就把20665500告訴我朋友。我朋友再次計算20665500 ^ 19880516的值,得到1314520。
相同位不同則為1,相同則為0。
如:
00101
11100
^----------------
11001
not運算 ~
not運算的定義是把記憶體中的0和1全部取反。使用not運算時要格外小心,你需要注意整數型別有沒有符號。如果not的物件是無符號整數(不能表示負數),那麼得到的值就是它與該型別上界的差,因為無符號型別的數是用00到$ffff依次表示的。
常見的位運算
計算機中的數在記憶體中都是以二進位制形式進行儲存的,用位操作就是直接對整數在記憶體中的二進位制位進行操作,因此其執行效率非常高,在程式中盡量使用位運算進行操作,這會大大提高程式的效能。位操作是各大網際網路公司面試經常會問的一類問題。int a 8 a 3 移位前 0000 0000 0000 000...
常見的位運算
運算 效果x 1 x 1 乘 除2 x 1 判斷x是否為奇數 x x 1 去掉x最低位的1 x x 取出最低位的1 x 1 i 1 判斷二進位制下x的第i位是不是1 x 1 i 1 把二進位制下x的第i位變成1 由於今天是第一次運用狀態壓縮,所以總結一下剛剛做的用了狀態壓縮的乙個題目。先附上這個題目...
常見位運算
builtin ffs x 返回x的最後一位1是從後向前第幾位 builtin popcount x 返回x的二進位制下1的個數 x x 只保留最後一位1的二進位制 x x x 1 清零最低位的1 x 1 判斷奇偶 x 1 n 將第n位置1 x 1 n 將第n位置0 x 1 k 1 對x的第k位取反...