注意:
1.要做位运算,首先得把数字转化为二进制并且是补码。
2.&,|当两边都是数字时,为位运算符;当两边为布尔值时,为逻辑运算符。
位运算符包括:&,|,^,~,<<,>>,>>>.
与位运算符
//&运算符,有0则0
//3 00000000 00000000 00000000 00000011
//4 00000000 00000000 00000000 00000100
// 00000000 00000000 00000000 00000000
System.out.println(3&4);//结果为0
或位运算符
//|运算符,有1则1
//3 00000000 00000000 00000000 00000011
//4 00000000 00000000 00000000 00000100
// 00000000 00000000 00000000 00000111
System.out.println(3|4);//结果为7
异或运算符
//^运算符,有相同则0,异同则1.
//3 00000000 00000000 00000000 00000011
//4 00000000 00000000 00000000 00000100
// 00000000 00000000 00000000 00000111
System.out.println(3^4);//结果为7
//注意:一个数对另一个数异或两次,该数本身不变。a^b^b = a。
按位取反运算符
//|运算符,有1则1
//3 00000000 00000000 00000000 00000011
// 11111111 11111111 11111111 11111100
//补码 11111111 11111111 11111111 11111100
//反码 11111111 11111111 11111111 11111011
//源码 10000000 00000000 00000000 00000100 -4
System.out.println(~3);//结果为7
左移<<
//<<左移 左边最高位丢弃,右边补齐0
//3 00000000 00000000 00000000 00000011
//(00)000000 00000000 00000000 0000001100
//<<把<<左边的数据*2的移动次幂
System.out.println(2<<2);//结果为8
右移>>
//<<右移 左边最高位是0补齐0,左边最高位是1补齐1
//4 00000000 00000000 00000000 0000100
// 00000000 00000000 00000000 000000100
//<<把<<左边的数据*2的移动次幂
System.out.println(4>>2);//结果为1
无符号移动>>>,无论左边是0还是1,左边都补0
练习:
请用最有效的方式计算出2*8?
2<<3 = 16
乘法的底层就是用为运算进行计算的。