位运算符

位运算符:

  • &("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怎么求最快
<< 按位左移
>> 按位右移
 
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取余
posted @ 2021-01-06 22:41  张三丰学Java  阅读(106)  评论(0编辑  收藏  举报