与(&)、或(|) 、非(~)、异或(^)运算符
举些个例子来看看:
与运算
int a=15; // 0000 0000 0000 1111
int b=2; // 0000 0000 0000 0010
System.out.println(a&b) // 0000 0000 0000 0010
一正一负的运算方式就不一样了(这里就用两个字节位来表示了):
int a=15; // 原码:0000 1111
int b=-2; // 原码:1000 0010;反码:1111 1101;补码:1111 1110
System.out.println(a&b) // 0000 1110
总结:各位都为1时,才得1,
有负数时另说:要先把负数的原码转为补码后再进行运算。
转换方法请参考:什么是原码、反码、补码
或运算
int a=15; // 0000 1111
int b=2; // 0000 0010
System.out.println(a|b) // 0000 1111
一正一负时算法同上,先把负数转补码再运算。
总结:各位都为0时,才得0
非运算
// 因为‘非’是单元运行符,这里就直接举例:求~5
//5的二进制是 0000 0101
//则~5是 1111 1010 (此时是补码形式,将其转回原码后可得) 十进制是 -6。
一正一负时算法同上,先把负数转补码再运算。
总结:各位取反
异或运算
int a=15; // 0000 1111
int b=2; // 0000 0010
System.out.println(a^b) // 0000 1101
一正一负时算法同上,先把负数转补码再运算。
总结:各位上,同为假,异为真。
‘<<’、‘>>’ 运算符
同样上个例子先:
- 左移运算(<<)
int i = 5; //原始二进制: 0000 0101
System.out.println(Integer.toBinaryString(i << 2)); //0001 0100
左移时不管正负,低位补0
- 右移运算(>>)
int i = 5; //原始二进制: 0000 0101
System.out.println(Integer.toBinaryString(i >> 2)); //0000 0001
int i = -5; //原始二进制: 1111 1011
System.out.println(Integer.toBinaryString(i >> 2)); //1111 1110
若为正数,高位补0,若为负数,高位补1
- 最后总结一下,位移运算符能干嘛呢?
一句话:左移n位即乘以2的n次方,右移则除以2的n次方。
举两个例子:
1、如何用最有效率的方式计算 3乘以8?
答:3<<3
2、如何用最有效率的方式计算 3乘以31?
答:(3<<5)- 3