& 運算:1 & 1 = 1,其他都為0(有0即為0)
| 運算: 0 | 0 = 0 ,其他都為1(有1即為1)
^ 運算 : 0 ^ 0 = 0, 1 ^ 1 = 0 (相同數字^為0,不同數字^為1)
~運算: ~1001 = 0110 ( 將所有位取反,也叫取反運算)
1.判斷給定數字的奇偶性
if((x & 1) = 1)
x is 奇
else
x is 偶
判斷乙個數是否奇偶,只要判斷該數二進位制的最後一位是否為1即可。如下
//判斷數字9是否為奇數
00001001
00000001 (1的二進位制)
& --------
00000001
最後得出數字與1進行&運算後,結果為1為奇數,為0為偶數。
2.測試給定數字的第n位是否是1
if (x & (1 << n) == 0)
x的第n位是0
else
x的第n位是1
此用法與上面的大同小異,只是將1左移對應的n位,通過&運算來判斷該位置是否為1。
//判斷125的第3位是否為1
125 & (1 << 3)
125 1111101
1<<3 0001000
& -------
0001000 (8)
結果為8,不為0,因此125第三位為1.
3.將給定數字x的第n位置為1
x | (1 << n)
由於|運算的特性,所以我們可以用來置1,如下將125第2位置1
//將指定數字125第2位置為1
125 | (1 << 2)
125 1111101
1<<2 0000010
| -------
1111111 (127)
4.將給定數字x的第n位置0
y = x & ~(1 << n)
~(1 << n) 將除了第n位的其他位置為1,n位置為0.
//將指定數字125的第3位置為0
125 & ~(1 << 3)
125 1111101
~(1<<3) 1110111
& -------
1110101 (117)
5.將給定數字第n位反轉(0變為1,1變為0)
x ^ (1 << n)
來看個具體例子
// 將數字125的第4位反轉
125 ^ (1 << 4)
125 1111101
1<<4 0010000
^ -------
1101101 (109)
// 將數字109的第4位反轉
109 ^ (1 << 4)
109 1101101
1<<4 0010000
^ -------
1111101 (125)
6.將給定數字的最右邊的1置為0
y = x & (x - 1)
//將125最右邊的1置為0
125 & (125 - 1)
125 1111101
124 1111100
& -------
1111100
為什麼x & (x-1)會達到這種效果呢?
其實我們只要明白了二進位制四則運算原理就簡單了。二進位制減法中會進行有借位一說,如0-1=1,其實是0向前借一位變為10(10在二進位制中為2),再減1得到1;所以我們x-1就是x從最右邊開始如果為0變為1,碰到1變為0並停止(10010->10001;10011->10010),因此將兩個數進行&運算將會得到x最右邊1變為0的結果。
7.除了最右邊的1,其他置為0
這個其實正好與上面相反,先將x-1取反,在進行&運算
//取反再&
x & ~(x - 1)
x & (-x)
~(x - 1) *****》 -x
//對於~10,在計算機中儲存為
11111111 11111111 11111111 11110101 (這是10取反的結果,但卻是未知數x的補碼形式)
//先取反,得
00000000 00000000 00000000 00001010 (此處,再次取反,返回10)
//再加1,得
00000000 00000000 00000000 00001011 (10+1得11)
//最高位變1,即
10000000 00000000 00000000 00001011 (取相反數即-11)
//看出規律
~x = -(x + 1)
-x = ~(x - 1)
8.將最右邊的1的右邊位置 置為1
//這裡只要明白|運算的規則就簡單了
x | (x - 1)
x-1會將最右邊1置為0,並將此1後面的0置為1,此1之前的不變,再進行&運算就完成了。
9.將最右邊0置為1,其他位置為0
//其實與第7點類似
~x & (x + 1)
這個我們首先明白x+1做了什麼操作---》二進位制+運算會將最右邊的0置為1,並將此0右邊的1置為0(1000101+1=1000110);
再思考我們如果想將所有位置0,必須與自身相反的數取&,因此最後得出結論:只要有拿到x的最右邊的0置為1的數,與~x取&,就大功告成了。o(∩_∩)o~
10.將最右邊的0置1
//其實與上面第8點類似
x | (x + 1)
有了上面的基礎,這個就異常簡單了,只要把最右邊0置為1,那就是+1操作,進行|運算就ok了。
綜上所述,我們想0置1,就進行+運算;想1置0,就進行-運算。
位操作的世界方才窺得一點,道阻且長,只能上下求索啦!
常用位操作
參加運算的兩個資料,按二進位制位進行 與 運算。運算規則 0 0 0 0 1 0 1 0 0 1 1 1 即 兩位同時為 1 結果才為 1 否則為0 例如 3 5 即 0000 0011 0000 0101 0000 0001 因此,3 5的值得1。另,負數按補碼形式參加按位與運算。與運算 的特殊用...
常用位操作
x 0s x x 0s 0 x 0s x x 1s x x 1s x x 1s 1s x x 0 x x x x x x a b a b a a b b 該方法將1左移i位,得到形如00010000的值。接著,對這個值和num執行 位與 操作,從而將i位之外的所有位清零。最後,檢查該結果是否為零。不...
位運算相關操作整理
and 通常用於二進位制位操作,如乙個數 1的結果就是取二進位制的最末尾,可以用來判斷整數奇偶 or 通常用於二進位制定位上的無條件賦值,例如乙個數or1的結果就是把二進位制最末位強行變成1,若要變成0則減1就可以了,實際意義就是把這個數強行變成最接近的偶數 xor 通常用於對二進位制的特定一位進行...