程序中的所有数在计算机内存中都是以二进制的形式储存的,即只有0和1两种数值,位运算就是直接对整数在内存中的二进制位进行。 1 <<(向左位移) 运算规则:a<<b,表示a转为二进制后左移b位,左移后,空位补0。 例: 3: 00000000 00000000 00000000 00000011 // 左移2位,空位补2个0 3<<2: 00000000 00000000 00000000 00001100 所以,3<<2 = 12 规律:a左移b位,就是a乘以2的b次方。 2 >>(向右位移) 运算规则:a>>b,表示a转为二进制后右移b位,右移后,最高位是0,则空缺位补0;最高位是1,则空缺位补1。 例: 4: 00000000 00000000 00000000 00000100 // 右移1位。右移后,最高位是0,则空缺位补0;最高位是1,则空缺位补1 4>>1 00000000 00000000 00000000 00000010 所以,4 >> 1 = 2 规律:a右移b位,就是a除以2的b次方。 3 &(与运算) 运算规则:相同位的两个数字都为1,则为1;若有一个不为1,则为0。 例: 5: 00000000 00000000 00000000 00000101 6: 00000000 00000000 00000000 00000110 5&6: 00000000 00000000 00000000 00000100 所以,5&6 = 4 4 |(或运算) 运算规则:相同位只要有一个为1即为1。 例: 5: 00000000 00000000 00000000 00000101 6: 00000000 00000000 00000000 00000110 5|6: 00000000 00000000 00000000 00000111 所以,5|6 = 7 5 ^(异或运算) 运算规则:针对二进制位,如果某位不同则该位为1, 否则该位为0。 例: 5: 00000000 00000000 00000000 00000101 6: 00000000 00000000 00000000 00000110 5^6: 00000000 00000000 00000000 00000011 所以,5^6 = 3 6 ~(取反运算) 运算规则:对二进制各位数进行取反,即1变成0,0变成1。 例: 5: 00000000 00000000 00000000 00000101 ~5: 11111111 11111111 11111111 11111010 // 补码形式 11111111 11111111 11111111 11111001 // 反码 10000000 00000000 00000000 00000110 // 原码 所以,~5 = -6 位运算的一些妙用
常规操作: void swap(int a, int b) { int temp = a; a = b; b = temp; } 骚操作: void swap(int a, int b) { a^=b; b^=a; a^=b; }
常规操作: if (a%2 == 0) { System.out.println('偶数'); } else { System.out.println('奇数'); } 骚操作: if ((a&1) == 0) { System.out.println('偶数'); } else { System.out.println('奇数'); }
常规操作: int average(int x, int y) { return (x+y)/2; } 骚操作: int average(int x, int y) { return (x&y)+((x^y)>>1); } |
|