常用位操作以及相關原理

2021-09-02 01:24:11 字數 3191 閱讀 3432

& 運算: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 通常用於對二進位制的特定一位進行...