程序中的所有數(shù)在計算機內(nèi)存中都是以二進制的形式儲存的,即只有0和1兩種數(shù)值,位運算就是直接對整數(shù)在內(nèi)存中的二進制位進行。
1 <<(向左位移)
運算規(guī)則:a<<b,表示a轉(zhuǎn)為二進制后左移b位,左移后,空位補0。
例:
所以,3<<2 = 12
規(guī)律:a左移b位,就是a乘以2的b次方。
2 >>(向右位移)
運算規(guī)則:a>>b,表示a轉(zhuǎn)為二進制后右移b位,右移后,最高位是0,則空缺位補0;最高位是1,則空缺位補1。
例:
4: 00000000 00000000 00000000 00000100 // 右移1位。右移后,最高位是0,則空缺位補0;最高位是1,則空缺位補1 4>>1 00000000 00000000 00000000 00000010
所以,4 >> 1 = 2
規(guī)律:a右移b位,就是a除以2的b次方。
3 &(與運算)
運算規(guī)則:相同位的兩個數(shù)字都為1,則為1;若有一個不為1,則為0。
例:
所以,5&6 = 4
4 |(或運算)
運算規(guī)則:相同位只要有一個為1即為1。
例:
5: 00000000 00000000 00000000 00000101 6: 00000000 00000000 00000000 00000110 5|6: 00000000 00000000 00000000 00000111
所以,5|6 = 7
5 ^(異或運算)
運算規(guī)則:針對二進制位,如果某位不同則該位為1, 否則該位為0。
例:
所以,5^6 = 3
6 ~(取反運算)
運算規(guī)則:對二進制各位數(shù)進行取反,即1變成0,0變成1。
例:
5: 00000000 00000000 00000000 00000101 ~5: 11111111 11111111 11111111 11111010 // 補碼形式 11111111 11111111 11111111 11111001 // 反碼 10000000 00000000 00000000 00000110 // 原碼
所以,~5 = -6
位運算的一些妙用
在不使用第三個變量的情況下,如何交換兩個變量的值?
常規(guī)操作:
騷操作:
void swap(int a, int b) { a^=b; b^=a; a^=b; }
判斷奇偶
常規(guī)操作:
騷操作:
if ((a&1) == 0) { System.out.println('偶數(shù)'); } else { System.out.println('奇數(shù)'); }
求平均數(shù)
常規(guī)操作:
騷操作:
int average(int x, int y) { return (x&y)+((x^y)>>1); }