位运算符:
- &("and")
- | ("or")
- ^ ("xor")
- ~("not")
- &和|运算符不采用"短路"的方式来求值。所以计算结果之前两个操作数都需要计算。
- 而&&和||都采用短路的方式,所以第一个操作符false则不继续计算后续。
a = 0011 1100;
b = 0000 1101;
a&b = 0000 1100 // 按位比较,两个数都为1才为1,否则就是0
a|b = 0011 1101 // 按位比较,如果都为0才为0,否则就是1
a^b = 0011 0001 // 按位比较,如果相同则为0,否则为1
~b = 1111 0010 // 取反
<< 按位左移
>> 按位右移
2 * 8 = 16 2*2*2*2
// 位运算效率极高
<< 相当于 *2
>> 相当于 /2
0000 0000 0
0000 0001 1
0000 0010 2
0000 0100 4
0000 1000 8
0001 0000 16
>>>
运算符会用0填充高位,这与>>
不同,它会用符号位填充高位。
- 不存在
<<<
运算符
- 移位运算符的右操作数要完成模32的运算(除非左操作符是long类型,此时需要对右操作数模64)。例如,1<<35的值等于1<<3或8。
- 对于int类型数据进行移位,底层的真正移动位数是给定位数对32取余
- 对于long类型数据进行移位,底层的真正移动位数是给定位数对64取余