眾所周知,位運算是我們學計算機必學的東西,前人用二進位制、位運算給我們了乙個操作簡單的計算機,但我們卻很少接觸位運算了。今天介紹一些位運算在演算法中的運用。
位運算基礎
&按位與
如果兩個相應的二進位制位都為1,則該位的結果值為1,否則為0
|按位或
兩個相應的二進位制位中只要有乙個為1,該位的結果值為1
^按位異或
若參加運算的兩個二進位制位值相同則為0,否則為1~取反
~是一元運算子,用來對乙個二進位制數按位取反,即將0變1,將1
<<
左移用來將乙個數的各二進位制位全部左移n位,右補0
>>
右移將乙個數的各二進位制位右移n位,移到右端的低位被捨棄,對於無符號數, 高位補0
奇技淫巧
1.技巧一:用於消去x的最後一位的1
x & (x-1)
x = 1100
x-1 = 1011
x & (x-1) = 1000
1.1.應用一 用o(1)時間檢測整數n是否是2的冪次.
思路解析:n如果是2的冪次,則n滿足兩個條件。
1.n>0
2.n的二進位制表示中只有乙個1
一位n的二進位制表示中只有乙個1,所以使用n&(n-1)將唯一的乙個1消去。
如果n是2的冪次,那麼n&(n-1)得到結果為0,即可判斷。
1.2.應用二 計算在乙個 32 位的整數的二進位制表示中有多少個 1.
思路解析:
由 x & (x-1) 消去x最後一位知。迴圈使用x & (x-1)消去最後一位1,計算總共消去了多少次即可。
1.3.將整數a轉換為b,需要改變多少個bit位
思路解析
這個應用是上面乙個應用的拓展。
思考將整數a轉換為b,如果a和b在第i(0<=i<32)個位上相等,則不需要改變這個bit位,如果在第i位上不相等,則需要改變這個bit位。所以問題轉化為了a和b有多少個bit位不相同。聯想到位運算有乙個異或操作,相同為0,相異為1,所以問題轉變成了計算a異或b之後這個數中1的個數。
2.技巧二 使用二進位制進行子集列舉
應用.給定乙個含不同整數的集合,返回其所有的子集
樣例如果 s = [1,2,3],有如下的解:
[ [3], [1], [2], [1,2,3], [1,3], [2,3], [1,2] ]
思路思路就是使用乙個正整數二進位制表示的第i位是1還是0,代表集合的第i個數取或者不取。所以從0到2n-1總共2n個整數,正好對應集合的2^n個子集。
s =
n bit combination
0 000 {}
1 001
2 010
3 011
4 100
5 101
6 110
7 111
解題**
之後補充。
技巧三.a^b^b=a
3.1.應用一 陣列中,只有乙個數出現一次,剩下都出現三次,找出出現一次的。
問題given [1,2,2,1,3,4,3], return 4
解題思路
因為只有乙個數恰好出現乙個,剩下的都出現過兩次,所以只要將所有的數異或起來,就可以得到唯一的那個數。
c語言解題**
#include
int main()
;int ans=0;
for(int i=0;i<7;i++)
printf("%d\n",ans);
}3.2.應用二 陣列中,只有乙個數出現一次,剩下都出現三次,找出出現一次的。
問題given [1,1,2,3,3,3,2,2,4,1] return 4
解題思路
因為數是出現三次的,也就是說,對於每乙個二進位制位,如果只出現一次的數在該二進位制位為1,那麼這個二進位制位在全部數字**現次數無法被3整除。
模3運算只有三種狀態:00,01,10,因此我們可以使用兩個位來表示當前位%3,對於每一位,我們讓two,one表示當前位的狀態,b表示輸入數字的對應位,two+和one+表示輸出狀態。
0 0 0 0 0
0 0 1 0 1
0 1 0 0 1
0 1 1 1 0
1 0 0 1 0
1 0 1 0 0
one+ = (one ^ b) & (~two)
two+ = (~one+) & (two ^ b)
c語言解題**
#include
void findnum(int *a,int n)
;for(int i=0;i>j)&1);}}
for(int i=0;i<32;i++)
for(int i=0;i>pos)&1)
}y=x^ans;
if(x>y) swap(x,y);//從大到小輸出x,y
printf("%d %d\n",x,y);
}int main()
;findnum(a,8);
}另外一種寫法
#include
void findnum(int *a,int n)
int main()
;findnum(a,8);
}**
位運算應用
位運算 針對整型 字元型,計算機會將它轉換為二進位制運算 1 按位與 x y 對應位都為1時才為1 用途 取 保留1個數的某位 對應掩碼的對應位為1 其餘各位置1 2 按位或 x y 對應位都為0才為0,否則為1 用途 將1個數的某些位置1,其餘不變 3 按位異或 x y 對應位相同為0,不同為1 ...
位運算應用
1.判斷乙個數的奇偶性。x 1 101 1 1 2.判斷x是否是2的正整數冪。x x 1 100 011 0 3.取出乙個數的某些二進位制位。3.1.x 1 d 1 10101 1 3 1 00100 取第d位 3.2.x 1 d 1 10101 1 3 1 00101 取最後d位,x對2 d取模 ...
位運算應用
位運算是指按二進位制進行的運算。在系統軟體中,常常需要處理二進位制位的問題。c語言提供了6個位操作 運算子。這些運算子只能用於整型運算元,即只能用於帶符號或無符號的char,short,int與long型別。c語言提供的位運算子列表 運算子 含義 描述 按位與 如果兩個相應的二進位制位都為1,則該位...