位运算
&与 ~取反
&就是两位都为1 结果为1 负责为0 ~就是取反1=0 0=1
public class BitOperator{
//演示位运算
public static void main(String[]args){
System.out.println(2&3);
//首先将2和3的补码推算出来 由于是int类型占4个字节所以
//2的原码是 00000000 00000000 00000010 正数是三码合一所以补码也是这个
//3的原码是 00000000 00000000 00000011 正数是三码合一所以补码也是这个
//2&3 2与3规则 两位都是1 结果为1 否则为0
//结果就是 00000000 00000000 00000010 结果是正数所以直接转成十进制就是 2
System.out.println(~-2);
//-2的原码 10000000 00000000 00000010
//-2的反码 11111111 11111111 11111101
//-2的补码 11111111 11111111 11111110
//-2取反 00000000 00000000 00000001 结果是正数直接转成十进制结果为1
System.out.println(~2);
//2的原码 00000000 00000000 00000010
//2的补码 00000000 00000000 00000010
//2取反 11111111 11111111 11111101 结果是负数先求出反码
// 反码 11111111 11111111 11111100
// 原码 10000000 00000000 00000011 转换成10进制就是 -3
}
}
>>算术右移和 <<算术左移 >>>逻辑右移(无符号右移)
>>算术右移:低位溢出,符号位不变,并用符号位补溢出的高位 就是低位的数字右移相当于丢掉 这个字节的高位补符号位的数字 符号位不变(也可以理解为左边的除以右边的除以右边的6/2/2)
案例:6>>2
=00000110 10溢出(丢掉)符号位0补高位 =00000001 结果为1
负数演示
-5>>2
=10000101(原码)=11111011(补码)=11111110(结果的补码)=11111101(结果的反码)=10000010(结果原码)=-2
<<算术左移符号位不变低位 补0 就是低位向高位移动 空出来的低位填0(也可以理解为左边的乘以右边的乘以右边的)
案例:6<<2
=00000110 11左移 空处补0=00011000=24
负数演示
-3<<2
=10000011原码=111111100反码=11111101补码=左移符号位不变 空处补0=11110100结果的补码=11110011结果的反码=10001100结果的原码= -12
>>>逻辑右移(无符号右移)
就是算术右移 少了个符号位不变的要求
代码实例
public class BitOperator{
//演示位运算
public static void main(String[]args){
System.out.println(6>>2);//1
System.out.println(-5>>2);//-2
System.out.println(6<<2);//24
System.out.println(-3<<2);//-12
}
}