运算符用法
运算符 | 用法 | 描述 |
---|---|---|
按位与( 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
对于布尔值,按位操作符具有与逻辑操作符相同的效果,只是它们不会中途 “短路”
参考链接
-
Java编程思想(第四版)——(美) Bruce Eckel