常用技巧 —— 位运算 —— 位运算基础
【與運算】
與運算常用于二進制的取位操作,其用符號 & 表示,相同位的兩個數字都為1,則為1,若有一個不為1,則為0。
例如:00101 & 11100 = 00100
其會將兩個十進制數在二進制下進行與運算,然后返回其十進制下的值。
例如:3(11) & 2(10) = 2(10)
典型應用:任意一個數 &1 的結果就是取二進制的最末位,常用于判斷數的奇偶,最末位為 0 表示該數為偶數,最末位為 1 表示該數為奇數。
【或運算】
或運算常用于二進制特定位上的無條件賦值,其用符號 | 表示,相同位的兩個數字只要一個為 1 即為 1。
例如:00101 |?11100 = 11101
其會將兩個十進制數在二進制下進行或運算,然后返回其十進制下的值。
例如:3(11)|2(10)=3(11)。
典型應用:一個數 |?1 的結果就是把二進制最末位強行變成 1,如果需要把二進制最末位變成 0,對這個數 |?1 后再減一即可,其實際意義就是把這個數強行變成最接近的偶數。
【非運算】
非運算是把內存中的 0 和 1 全部取反,用符號 ~?表示。
使用非運算時要格外小心,需要注意整數類型有沒有符號,如果非運算的對象是無符號整數,那么得到的值就是它與該類型上界的差,因為無符號類型的數是用 00 到 $FFFF 依次表示的。
【異或運算】
異或運算,是對等長二進制模式按位執行邏輯按位異或操作,用符號 ^ 表示,如果某位不同則該位為 1,否則該位為 0。
例如:00101 ^?11100 = 11001
其會將兩個十進制數在二進制下進行異或運算,然后返回其十進制下的值。
例如:3(11) ^ 2(10) = 1(01)
異或運算的逆運算是它本身,也就是說兩次異或同一個數最后結果不變,即:(a ^?b) ^?b = a
【左移與右移】
1.左移運算
左移運算,用符號 << 表示,操作 a << b 就是把 a 轉為二進制后左移 b 位(在后面填充 b 個 0),實質上就是 a 乘以 2 的 b 次方,因為在二進制數后添一個 0 就相當于該數乘以 2。
例如:100(1100100) << 2 = 400(110010000)
通常認為,a <<?1 比 a*2 要更快,因為前者是更底層的操作,因此程序中乘以 2 的多少次方的操作盡量用左移位來代替。
2.右移運算
右移運算,用符號 << 表示,操作 a >> b 就是把 a 轉為二進制后右移 b 位(去掉末尾?b 個 0),實質上就是 a 除以 2 的 b 次方(取整)。
例如:400(110010000) >>?2 = 100(1100100)
通常認為,a >>?1 比 a/2 要更快,因為前者是更底層的操作,因此程序中除以?2 的多少次方的操作盡量用右移位來代替。
總結
以上是生活随笔為你收集整理的常用技巧 —— 位运算 —— 位运算基础的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 小Z的袜子(BZOJ-2038)
- 下一篇: 图论 —— 环与块 —— 负权环