程序中的所有数字都是以二进制形式存储在计算机内存中,即只有0和1两个数值,位操作是直接执行内存中整数的二进制位。
1(向左偏移)
运算规则:ab,意思是A转换成二进制后向左移位B位,左移后的空格用0填充。
示例:
3: 00000000 00000000 00000000 00000011
//向左移动2位,并在空白处填入2个零。
32: 00000000 00000000 00000000 00001100
所以,32=12
规则:A向左移动B,即A乘以B的2次方。
2(向右移动)
操作规则:ab,意思是A转换成二进制后向右移动B位。向右移位后,如果最高位为0,则空位填充为0;如果最高位为1,则空位用1填充。
示例:
4: 00000000 00000000 00000000 00000100
//向右移动1位。向右移动后,最高位为0,则空位填充为0;如果最高位为1,则空位用1填充。
41 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
56: 00000000 00000000 00000000 00000100
所以,56=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: 1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
11111111111111111111111111111111111111111111111111111111111111111111001//反码
100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
所以,~5=-6
位操作的一些神奇效果
如何在不使用第三个变量的情况下交换两个变量的值?常规操作:
void swap(int a,int b){ 0
int temp=a;
a=b;
b=温度;
}
骚操作:
void swap(int a,int b){ 0
a^=b;
b^=a;
a^=b;
}
判断奇偶的一般操作:
if(a % 2==0){ 0
System.out.println('偶数');
} else {
System.out.println('奇数');
}
骚操作:
if((a1)==0){ 0
System.out.println('偶数');
} else {
System.out.println('奇数');
}
平均常规操作:
int average(int x,int y){ 0
return(x y)/2;
}
骚操作:
int average(int x,int y){ 0
返回(xy)((x^y)1);
}
推荐阅读:
浅谈Java中的命名规范
本文向您介绍Java8中接口的默认方法。
深刻理解Java中方法的参数传递机制。
阿里开发者招聘节| 2019阿里巴巴技术面试问题集锦
你可能不知道的是自动包装和拆封。
抽象类和模板方法模式