📜  Java中的按位运算符

📅  最后修改于: 2020-03-24 02:39:31             🧑  作者: Mango

按位运算符用于对数字的各个位进行操作。它们可以与任何整数类型(char,short,int等)一起使用。在执行二进制索引树的更新和查询操作时使用它们。

  1. 按位或(|):
    此运算符是二进制运算符,用’|’表示。它按位返回输入值的OR,即,如果任一位为1,则为1,否则为0。
    例如,
    a = 5 = 0101(二进制)
    b = 7 = 0111(二进制)
    
    5和7的按位或运算
      0101
    | 0111
     ________
      0111 = 7(十进制)
    
  2. 按位与(&):
    此运算符是二进制运算符,用’&’表示。它返回输入值的位AND与运算,即如果两个位均为1,则为1,否则为0。
    例如,
    a = 5 = 0101(二进制)
    b = 7 = 0111(二进制)
    
    5和7的按位与运算
      0101
    &0111
     ________
      0101 = 5(十进制) 
  3. 按位XOR(^)
    此运算符是二进制运算符,用’^’表示。它按位返回输入值的XOR,即,如果相应的位不同,则为1,否则为0。
    例如,
    a = 5 = 0101(二进制)
    b = 7 = 0111(二进制)
    
    5和7的按位XOR运算
      0101
    ^ 0111
     ________
      0010 = 2(十进制)
  4. 按位补码(〜):
    此运算符是一元运算符,用’〜’表示。它返回输入值的补码表示形式,即所有位取反,表示它使每个0到1,以及每个1到0。
    例如,
    a = 5 = 0101(二进制)
    
    5的按位补码运算
    
    〜0101
     ________
      1010 = 10(十进制)

    注:编译器将给出该数字的2的补码,即2的10的补码为-6。

    // Java展示按位运算
    public class operators {
        public static void main(String[] args)
        {
            //初始化
            int a = 5;
            int b = 7;
            // 按位 and
            // 0101 & 0111=0101 = 5
            System.out.println("a&b = " + (a & b));
            // 按位 or
            // 0101 | 0111=0111 = 7
            System.out.println("a|b = " + (a | b));
            // 按位 xor
            // 0101 ^ 0111=0010 = 2
            System.out.println("a^b = " + (a ^ b));
            // 按位 and
            // ~0101=1010
            // 给出二进制的补码 1010 = -6
            System.out.println("~a = " + ~a);
            // 可以使用简短运算符
            // a=a&b
            a &= b;
            System.out.println("a= " + a);
        }
    }

    输出:

    a&b = 5
    a | b = 7
    a ^ b = 2
    〜a = -6
    a = 5

    移位运算符:这些运算符用于将数字的位向左或向右移位,从而分别将数字乘以或除以2。当我们必须将数字乘以或除以2时,可以使用它们。通用格式:

    number shift_op number_of_places_to_shift;
    1. 带符号的右移运算符(>>):
      将数字的位向右移,在结果空白处填充0。最左边的位取决于初始编号的符号。将数除以二的幂具有相似的效果。
      例如,
      例 1:
      a = 10
      a>>1 = 5
      例 2:
      a = -10
      a>>1 = -5
      我们保留了符号位.
    2. 无符号右移运算符(>>>):
      将数字的位数向右移位,并在左侧的空白处填充0。最左边的位设置为0。(>>>)为无符号移位;它将插入0。(>>)为有符号,并将暴力与符号位。
      例如,
      例 1:
      a = 10
      a>>>1 = 5
      例 2:
      a = -10
      a>>>1 = 2147483643
      不能保留符号位.
    3. 左移运算符(<<):
      将数字的位向左移,在结果空白处填充0。与将数字乘以2的乘方相似的效果。
      例如,
      a = 5 = 0000 0101
      b = -10 = 1111 0110
      a << 1 = 0000 1010 = 10
      a << 2 = 0001 0100 = 20
      b << 1 = 0000 1010 = -20
      b << 2 = 0001 0100 = -40
    4. 无符号左移运算符(<<<):
      与无符号右移运算符不同,Java中没有“ <<<“运算符,因为逻辑(<<)和算术左移(<<<)运算是相同的。
      // Java展示左移运算符
      public class operators {
          public static void main(String[] args)
          {
              int a = 5;
              int b = -10;
              // 左移运算符
              // 0000 0101<<2 =0001 0100(20)
              // 等效于 5*(2^2)
              System.out.println("a<<2 = " + (a << 2));
              // 右移运算符
              // 0000 0101 >> 2 =0000 0001(1)
              // 等效于 5/(2^2)
              System.out.println("b>>2 = " + (b >> 2));
              // 无符号右移运算符
              System.out.println("b>>>2 = " + (b >>> 2));
          }
      }

      输出:

      a<<2 = 20
      b>>2 = -3
      b>>>2 = 1073741821