01 位移运算

  • 左移 扩大

    • 1>>4 即1 * 2 * 2 * 2 * 2 = 16 左移 4 位即pow(2,4)

    • Java提供的位运算符有:左移( << )、右移( >> ) 、无符号右移( >>> ) 、位与( & ) 、位或( | )、位非( ~ )、位异或( ^ ),除了位非( ~ )是一元操作符外,其它的都是二元操作符。

      1. 左移( << )

      a << b 表示将数值 a 的二进制数值从 0 位算起到第 b - 1 位,整体向左方向移动 b 位,符号位不变,低位空出来的位补数值 0。

      a << b = a * (2 ^ b)
      

      2. 右移( >> )

      a >> b 表示将数值 a 的二进制数值从 0 位算起到第 b - 1 位,整体向右方向移动 b 位,符号位不变,高位空出来的位补数值 0。

      a >> b = a / ( 2 ^ b )
      

      3. 无符号右移( >>> )

      无符号右移运算符>>>和右移运算符>>是一样的,只不过右移时左边是补上符号位,而无符号右移运算符是补上0,也就是说,对于正数移位来说等同于:>>,负数通过此移位运算符能移位成正数。

      4. 位与( & )

      与运算时,进行运算的两个数,从最低位到最高位,一一对应。如果某 bit 的两个数值对应的值都是 1,则结果值相应的 bit 就是 1,否则为 0.

      0 & 0 = 0,
      
      0 & 1 = 0,
      
      1 & 1 = 1
      

      5. 位或( | )

      与运算时,进行运算的两个数,从最低位到最高位,一一对应。如果某 bit 的两个数值对应的值只要 1 个为 1,则结果值相应的 bit 就是 1,否则为 0。

      0 | 0 = 0,
      
      0 | 1 = 1,
      
      1 | 1 = 1
      

      6. 位异或( ^ )

      两个操作数进行异或时,对于同一位上,如果数值相同则为 0,数值不同则为 1。

      1 ^ 0 = 1,
      
      1 ^ 1 = 0,
      
      0 ^ 0 = 0;
      

      7. 位非( ~ )

      对操作数的每一位进行操作,1 变成 0,0 变成 1。