位運算總結

2022-01-25 14:12:23 字數 1917 閱讀 6486

用了那麼多位運算,這裡總結一下把。

先看常用的位運算有哪些吧:

1 &

a&b 就是a的二進位制形式與b的二進位制形式,相同的位置必須兩個都是1,那麼結果的相應位置就是1,否則就是0.

那麼a&b有什麼用呢?最簡單的,我覺得最常用的就是乙個二進位制的一部分出來。

例如:111011010011 我要取從左到右的第2到第5位,那怎麼辦呢?

111011010011

011110000000

只要把下面的數對111011010011 進行&運算就好了,就把1101取出來了。結果是11010000000 那麼大家常見的a&1,就是判斷偶數的方法,取a的最後一位,是1就是奇數,是0就是偶數。

還有狀態壓縮dp中經常用到,用來判斷兩種情況是否有重複的情況

2 |

只有有乙個位置為1,那麼該位置就是1;

那麼 | 運算最常用的就是拼接,怎麼拼接呢?以上面的例子對

111011010011 做&位算之後得到11010000000,現在把111011010011 2到5位變成0 得到100001010011,對二者做 | 運算

100001010011

011010000000

就又變成一開始的數。再舉個例子11000 和00101做 | 運算 就是拼接在一起答案就是11101

3 ^

相同位不同則為1,相同則為0。

^的最常用的就是剪下,例如11111111和11100000做 ^ 運算,那麼結果就是00011111 把111剪下掉了。

4 <<

a << b就表示把a轉為二進位制後左移b位(在後面添b個0).相當於a乘以2的b次方。

《的作用自然是向左移動二進位制上面的數字 例如 1101<<3 結果是1101000

5 >>

a >>b表示二進位制右移b位(去掉末b位),相當於a除以2的b次方(取整)>>作用是向右移動二進位制上面的數字,例如1101000>>3結果是1101

差不多這些,但是說了這麼多,並沒有體現到位運算的優勢。給一道例題吧,就可以看出位運算強大的優勢。

現在有長度最長為15的字串給你起始字串和目標字串,現在你只有兩種操作,乙個是交換第乙個和第二個字元,乙個是把最後乙個字元放到第乙個。字元只有兩種。問你最少移動幾次可以從起始狀態到達目標狀態。

大家都可以想到用廣搜,如果用string表示狀態,但是兩種操作將會非常麻煩,弄不好還會超時!因為字元只有兩種,二進位制壓縮可以的。兩種操作可以用o(1)的效率解決!!!

假設測試資料的長度為5 只有兩個字元a,b

ababa

aaabb

a表示1,b表示0 。那麼起始狀態壓縮成二進位制就是10101(22)

第乙個操作,把第乙個和第二個交換。我們可以把第一位和第二出來,然後剪下掉前兩位,交換之後再拼接

取第一位10101( 22 ) & 10000 ( 16 ) =num1取第二位 10101 & 1000(8)=num2

剪下前兩位10101 ^ 11000(24)=num3.那麼交換呢?很簡單,就是乙個向右移動一位,乙個向左移動一位。num1>>1,

num2<<1.最後拼接:num3 | num2 | num1.

所以最後第一種操作可以寫成 (22^24) | ( (22 & 16) >> 1) ) | ( (22 & 8 ) << 1)

第二個操作也很減單了,先把最後乙個取出來 然後整體向右移動 1位,取出來的向左移動4位,再拼接起來,自己試一下把。

這下兩種操作可以一步解決了。

位運算總結

位運算是指按二進位制進行的運算。在系統軟體中,常常需要處理二進位制位的問題。c語言提供了6個位操作 運算子。這些運算子只能用於整型運算元,即只能用於帶符號或無符號的char,short,int與long型別。c語言提供的位運算子列表 運算子 含義 描述 按位與 如果兩個相應的二進位制位都為1,則該位...

位運算總結

位運算是指按二進位制進行的運算。在系統軟體中,常常需要處理二進位制位的問題。c語言提供了6個位操作 運算子。這些運算子只能用於整型運算元,即只能用於帶符號或無符號的char,short,int與long型別。c語言提供的位運算子列表 運算子 含義 描述 按位與 如果兩個相應的二進位制位都為1,則該位...

位運算總結

一 優先順序 高 低 算術運算子 關係運算子 賦值 二 移位運算 要點 1 它們都是雙目運算子,兩個運算分量都是整形,結果也是整形。2 左移 右邊空出的位上補0,左邊的位將從字頭擠掉,其值相當於乘2。3 右移 右邊的位被擠掉。對於左邊移出的空位,如果是正數則空位補0,若為負數,可能補0或補1,這取決...