一、& 与运算
将算数转换成二进制,每一个相对应的位相与,都为 1 则为1,其他的为0
public void andCal(){
int a = 4; // 0100
int b = 10; // 1010
System.out.println(a & b); // 结果:0
}
0100 4 1010 10 ------- 0000 0
二、| 或运算
将算数转换成二进制,每一个相对应的位相或,有 1 则为1,都为0则为0
public void orCal(){
int a = 4; // 0100
int b = 10; // 1010
System.out.println(a | b); // 结果:14
}
0100 4 1010 10 ---------- 1110 14
三、^ 异或
将算数转换成二进制,每一个相对应的位异或,相同则为 0,不同则为1
public void orElse(){
int a = 4; // 0100
int b = 10; // 1010
System.out.println(a ^ b); // 结果:14
}
0100 4 1010 10 ----------- 1110 14
案列:两个变量值互换
public void tranport(){
int a = 4; // 0100
int b = 10; // 1010
a = a ^ b; // 1110
b = a ^ b; // 0100
a = a ^ b; // 1010
System.out.println(a); // 10
System.out.println(b); // 4
}
四、<< 左移运算
正数左移:整体向左移 n 位,右边空缺部分补 0,左边溢出部分舍弃
public void leftMove(){
int a = 4; // 00000100
System.out.println( a << 1 ); // 8
}
00000100 <<1 ---------------- 00001000
负数左移:先取反,再加1取补码,再左移,再减1,在取反
public void leftMove(){
int a = -4; // 10000100
System.out.println( a << 1 ); // -8
}
10000100 11111011 取反 11111100 +1取补码 11111000 左移 11110111 -1取反码 10001000 取反
左移规律:将原数 乘 2^n,n代表左移位数
五、>> 右移运算
正数右移:整体向右移 n 位,左边空缺部分补 0,右边溢出部分舍弃
public void leftMove(){
int a = 4; // 00000100
System.out.println( a >> 1 ); // 2
}
00000100 >>1 ------------- 00000010
负数右移:先取反,再加1取补码,再右移,再减1,在取反
public void leftMove(){
int a = -4; // 10000100
System.out.println( a >> 1 ); // -2
}
10000100 11111011 取反 11111100 加一取补码 11111110 右移 11111101 减1取反码 10000010 取反
右移规律:将原数 除2^n,n代表右移位数
六、>>> 无符号右移
正数与右移规则一样
负数先取反码,再加1取补码,再无符号右移
public void leftMove(){
int a = -4;
System.out.println( a >>> 1 );
// 2147483646
}
10000000 00000000 00000000 00000100 11111111 11111111 11111111 11111011 取反 11111111 11111111 11111111 11111100 加1 01111111 11111111 11111111 11111110 无符号右移