位運算技巧收藏

2021-09-07 20:37:48 字數 3048 閱讀 3556

目錄

各種特殊應用:

位運算功能

示例x >> 1

去掉最後一位

101101->10110

x << 1

在最後加乙個0

101101->1011010

x << 1 | 1

在最後加乙個1

101101->1011011

x | 1

把最後一位變成1

101100->101101

x & -2

把最後一位變成0

101101->101100

x ^ 1

最後一位取反

101101->101100

x | (1 << (k-1))

把右數第k位變成1

101001->101101,k=3

x & ~ (1 << (k-1))

把右數第k位變成0

101101->101001,k=3

x ^(1 <<(k-1))

右數第k位取反

101001->101101,k=3

x & 7

取末三位

1101101->101

x & (1 << k-1)

取末k位

1101101->1101,k=5

x >> (k-1) & 1

取右數第k位

1101101->1,k=4

x | ((1 << k)-1)

把末k位變成1

101001->101111,k=4

x ^ (1 << k-1)

末k位取反

101001->100110,k=4

x & (x+1)

把右邊連續的1變成0

100101111->100100000

x | (x+1)

把右起第乙個0變成1

100101111->100111111

x | (x-1)

把右邊連續的0變成1

11011000->11011111

(x ^ (x+1)) >> 1

取右邊連續的1

100101111->1111

x & -x

去掉右起第乙個1的左邊

100101000->1000

x&0x7f

取末7位

100101000->101000

x& ~0x7f

是否小於127

001111111 & ~0x7f->0

x & 1

判斷奇偶

00000111&1->1

-x = ~x + 1 = ~(x-1)

~x = -x-1

-(~x) = x+1

~(-x) = x-1

x+y = x - ~y - 1 = (x|y)+(x&y)

x-y = x + ~y + 1 = (x&~y)-(~x&y)

x^y = (x|y)-(x&y)(異或)

x|y = (x&~y)+y

x&y = (~x|y)-~x

x==y: ~(x-y|y-x)

x!=y: x-y|y-x

x< y: (x-y)^((x^y)&((x-y)^x))

x<=y: (x|~y)&((x^y)|~(y-x))

x< y: (~x&y)|((~x|y)&(x-y))//無符號x,y?較

x<=y: (~x|y)&((x^y)|~(y-x))//無符號x,y?較

n > 0 && ((n & (n - 1)) == 0 )
private int getnum(int n)

}return i;

}

迴圈使用x & (x-1)消去最後一位1,計算總共消去了多少次即可。

int swap(int a, int b)  

}

可以這樣理解:

a ^= b 即a = (a ^ b);

b ^= a 即b = b ^ (a ^ b),由於^運算滿**換律,b ^ (a ^ b)=b ^ b ^ a。由於乙個數和自己異或的結果為0並且任何數與0異或都會不變的,所以此時b被賦上了a的值;

a ^= b 就是a = a ^ b,由於前面二步可知a = (a ^ b),b = a,所以a = a ^ b即a = (a ^ b) ^ a。故a會被賦上b的值。

再來個例項說明下以加深印象。a = 13, b = 6:

a的二進位制為 13 = 8 + 4 + 1 = 1101(二進位制)

b的二進位制為 6 = 4 + 2 = 110(二進位制)

a ^= b a = 1101 ^ 110 = 1011;

b ^= a b = 110 ^ 1011 = 1101; 即b == 13

a ^= b a = 1011 ^ 1101 = 110; 即a == 6

變換符號就是正數變成負數,負數變成正數。

如對於-11和11,可以通過下面的變換方法將-11變成11:

1111 0101(二進位制)

取反-> 0000 1010(二進位制)

加1-> 0000 1011(二進位制)

同樣可以這樣的將11變成-11

0000 1011(二進位制)

取反-> 1111 0100(二進位制)

加1-> 1111 0101(二進位制)

因此變換符號只需要取反後加1即可。完整**如下:

int reversal(int a)
int abs(int a)  

i = a >> 31;要注意如果a為正數,i等於0,為負數,i等於-1。然後對i進行判斷——如果i等於0,直接返回;否之,返回~a + 1。

int abs(int a)  

這個是網上找到的,為正數可以很容易計算出結果就是a,為負數,。。。。

位運算技巧

1.lowbit x 實現 int lowbit int x 這個函式用來求數中二進位制位中最低位的1 完整求法 log2 lowbit x 需要注意的是,答案的範圍是0 30,因為31位是符號位,求出來的值為負數,原因如下 設x 0x8000 0000,那麼設res lowbit x 0x8000...

位運算技巧

數字和1相與 判斷奇偶 x 1 1 奇數 x 1 0 偶數 不用其他空間交換兩值 a a b b a b a a b 或a a b b a b a a b a 0 a a a 0 不用其他空間找陣列中唯一成對的那個數 int b 0 for int i 1 i 10 i int a 10 for i...

位運算技巧

1.或 符號 比較兩個數的每一位,只要有乙個數在這一位上為1,所得的新數在這一位上就為1,否則為0。2.與符號 比較兩個數的每一位,只有兩數這一位同時為1時所得新數為1,否則為0。3.異或 符號 比較兩數的每一位,如果一樣所得新數這一位就是0,不一樣就是1。4.取反 符號 0變1,1變0。5.移位 ...