按位操作符『Java』

运算符用法

运算符 用法 描述
按位与( AND ) a & b 对于每一个比特位,只有两个操作数相应的比特位都是 1 时,结果才为 1,否则为 0
按位或( OR ) a | b 对于每一个比特位,当两个操作数相应的比特位至少有一个 1 时,结果为 1,否则为 0
按位异或( XOR ) a ^ b 对于每一个比特位,当两个操作数相应的比特位有且只有一个 1 时,结果为 1,否则为 0
按位非( NOT ) ~ a 反转操作数的比特位,即 0 变成 1,1 变成 0

运算符使用

public static void main(String[] args) {
    int i = 60;
    int k = 18;
    int x = 0;
    LOGGER.info("{} toBinaryString = {}", i, Integer.toBinaryString(i));
    LOGGER.info("{} toBinaryString = {}", k, Integer.toBinaryString(k));
    x = i & k;
    LOGGER.info("{} & {} = {},result toBinaryString = {}", i, k, x,
                Integer.toBinaryString(x));
    x = i | k;
    LOGGER.info("{} | {} = {},result toBinaryString = {}", i, k, x,
                Integer.toBinaryString(x));
    x = i ^ k;
    LOGGER.info("{} ^ {} = {},result toBinaryString = {}", i, k, x,
                Integer.toBinaryString(x));
    LOGGER.info("~{},result = {} toBinaryString = {}", k, ~k,
                Integer.toBinaryString(~k));
    // 对布尔值进行按位运算
    LOGGER.info("{} & {},result = {}", true, false, true & false);
    LOGGER.info("{} | {},result = {}", true, false, true | false);
    LOGGER.info("{} ^ {},result = {}", true, false, true ^ false);
}

运算结果

2020-04-06 18:15:28.090 [main] INFO  com.zhiyin.test.MyTest - 60 toBinaryString = 111100
2020-04-06 18:15:28.098 [main] INFO  com.zhiyin.test.MyTest - 18 toBinaryString = 10010
2020-04-06 18:15:28.099 [main] INFO  com.zhiyin.test.MyTest - 60 & 18 = 16,result toBinaryString = 10000
2020-04-06 18:15:28.099 [main] INFO  com.zhiyin.test.MyTest - 60 | 18 = 62,result toBinaryString = 111110
2020-04-06 18:15:28.099 [main] INFO  com.zhiyin.test.MyTest - 60 ^ 18 = 46,result toBinaryString = 101110
2020-04-06 18:15:28.099 [main] INFO  com.zhiyin.test.MyTest - ~18,result = -19 toBinaryString = 11111111111111111111111111101101
2020-04-06 18:15:28.100 [main] INFO  com.zhiyin.test.MyTest - true & false,result = false
2020-04-06 18:15:28.100 [main] INFO  com.zhiyin.test.MyTest - true | false,result = true
2020-04-06 18:15:28.100 [main] INFO  com.zhiyin.test.MyTest - true ^ false,result = true

知识点

  • 按位操作符用来操作整数基本数据类型中的单个 “比特” 位(bit),即二进制位。按位操作符会对两个参数中对应的位执行布尔代数运算,并最终生成一个结果。

    对应的位:111100 与 10010 的布尔运算时,10010 只有五位,而 111100 有六位,此时需要在 10010 的高位(前面)补 0 变成 010010

  • 按位操作符来源于 C 语言面向底层的操作,在这种操作中经常需要直接操纵硬件,设置硬件寄存器内的二进制位。Java 的设计初衷是嵌入电视机机顶盒内,所以这种面向底层的操作仍被保留了下来。

  • 按位操作符可与等号(=)联合使用,以便合并运算和赋值:&=|=^= 都是合法的

    由于 ~一元操作符,所以不可与 = 联合使用

  • 按位操作符和逻辑操作符都使用了同样的符号,因此我们能方便地记住它们的含义:由于 “位” 是非常小的,所以按位操作符仅使用了一个字符。

  • 我们可对布尔类型作为一种单比特值对待,可对它执行按位 “与”,按位 “或” 和按位 “异或” 运算,但不能执行按位 “非”(大概是为了避免和逻辑NOT (!) 混淆)

    布尔值作为单比特值运算时:0 为 false,1 为 true

    对于布尔值,按位操作符具有与逻辑操作符相同的效果,只是它们不会中途 “短路”

参考链接

原文地址:https://www.cnblogs.com/zhiyin1209/p/12643377.html