用了那麼多位運算,這裡總結一下把。
先看常用的位運算有哪些吧:
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,這取決...