目錄
各種特殊應用:
位運算功能
示例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 )
迴圈使用x & (x-1)消去最後一位1,計算總共消去了多少次即可。private int getnum(int n)
}return i;
}
可以這樣理解: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:
同樣可以這樣的將11變成-111111 0101(二進位制)
取反-> 0000 1010(二進位制)
加1-> 0000 1011(二進位制)
因此變換符號只需要取反後加1即可。完整**如下:0000 1011(二進位制)
取反-> 1111 0100(二進位制)
加1-> 1111 0101(二進位制)
int reversal(int a)
i = a >> 31;要注意如果a為正數,i等於0,為負數,i等於-1。然後對i進行判斷——如果i等於0,直接返回;否之,返回~a + 1。int abs(int a)
這個是網上找到的,為正數可以很容易計算出結果就是a,為負數,。。。。int abs(int 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.移位 ...