位逻辑运算符
与运算(&)
与运算:两个运算数比较位都是 1,则结果为 1,否则为 0。例如:5 & 3 = 1
0000 0000 0000 0000 0000 0000 0000 0101 5 转换为二进制
0000 0000 0000 0000 0000 0000 0000 0011 3 转换为二进制
0000 0000 0000 0000 0000 0000 0000 0001 换算成 10 进制为 1
或运算(|)
或运算:两个运算数比较位有一个为 1,则结果为 1,否则为 0。例如:5 | 3 = 7
0000 0000 0000 0000 0000 0000 0000 0101 5 转换为二进制
0000 0000 0000 0000 0000 0000 0000 0011 3 转换为二进制
0000 0000 0000 0000 0000 0000 0000 0111 换算成 10 进制为 7
异或运算(^)
异或运算:两个运算数比较位不同时,其结果是 1,否则为 0。例如:5 ^ 3 = 6
0000 0000 0000 0000 0000 0000 0000 0101 5 转换为二进制
0000 0000 0000 0000 0000 0000 0000 0011 3 转换为二进制
0000 0000 0000 0000 0000 0000 0000 0110 换算成 10 进制为 6
非运算(~)
非运算:也叫做补,一元运算符,对其运算数的每一位取反。例如:~5 = -6
0000 0000 0000 0000 0000 0000 0000 0101 5 转换为二进制
1111 1111 1111 1111 1111 1111 1111 1010 取非后的原码
1000 0000 0000 0000 0000 0000 0000 0110 转换补码,换算成 10 进制为 -6
####其它
-
Java 中整数类型(byte、short、int 和 long)在内存中是以有符号的二进制补码表示。所以位运算时,首先要转换为原码。
-
补码转原码:补码转原码和原码转补码的方法是一样的,取反 + 1(补码的补码是原码)。
-
当位运算数是 byte 和 short 类型时,将自动把这些类型扩大为 int 型(32 位)。
-
计算出 n 位二进制数所能表示的最大十进制数位移算法:-1L ^ (-1L « n) 或 ~(-1L « n)。
-
byte 和 int 相互转换
int i = 234;
byte b = (byte) i; // 结果:b = -22
// 转换过程:
// 0000 0000 0000 0000 0000 0000 1110 1010 # int 234 的补码(与原码相等)
// 1110 1010 # byte 低位截取
// 1001 0110 # 求得补码,转为 10 进制为 -22
int x = b ; // 结果为:x = -22;8 位 byte 的转 32 的 int,值不变。
int y = b & 0xff; // 结果为:x = 234; 可以通过将其和 0xff 进行位与(&)得到它的无符值
// 转换过程:
// 1001 0110 # byte -22 的原码
// 1000 0000 0000 0000 0000 0000 0001 0110 # int -22 的原码
// 1111 1111 1111 1111 1111 1111 1110 1010 # int -22 补码
// 0000 0000 0000 0000 0000 0000 1111 1111 # 0xff 的二进制数
// 0000 0000 0000 0000 0000 0000 1110 1010 # 和 0xff 进与操作的结果,转换为 10 进制为 234