java位运算
/*
Java使用补码表示二进制数,在补码表示中,最高位为符号位 ,正数 的 符 号 位 为 0,负数 为 1。补 码 的 规 定 如 下 :
对正数来说 ,最高位为 0,其余各位代表数值本 身 (以二 进制 表 示 ),如 +42的补码 为 00101010。
对负数而言,把该数绝对值的补码按位取反加一,即得该数的补码。
如-1的补码为11111111111111111111111111111111 (绝对值1的补码00000000000000000000000000000001按位取反加一
11111111111111111111111111111110+1=11111111111111111111111111111111 )。
负数补码求源码:符号位不变,减一后按位取反。
符号位:正数为0,负数为1
*/
public static void main(String[] args) {
// 位运算demo 位运 算 符 中 ,除 ~ 以 外 ,其余 均 为 二 元 运 算 符 。 操 作 数 只 能 为 整 型 和字 符 型 数 据 。
// 移位:<< 左移 、 >> 右移>>>无符号右移
// 位与 & 只有两个操作数对应位同为1时,结果为1,其余全为0
// 位或 | 只要有一个操作数为1,结果就为1,否则为0
// 位异或 ^ 两数不相同时为1
// 位非 ~ 操作数的第n位为1,那么结果的第n位为0,反之。
// 1、左移( << ) // 0000 0000 0000 0000 0000 0000 0000 0101 然后左移2位后,低位补0://
// 0000 0000 0000 0000 0000 0000 0001 0100 换算成10进制为20
System.out.println(5 << 2);
System.out.println(100 >> 5);//左移 : a*(2^b) 右移 : a/(2^b)
// 2、右移( >> ) 高位补符号位
// 0000 0000 0000 0000 0000 0000 0000 0101 然后右移2位,高位补0:
// 0000 0000 0000 0000 0000 0000 0000 0001
System.out.println(5 >> 2);// 运行结果是1
// 3、无符号右移( >>> ) 高位补0 无符号右移中符号位当做数字,低位溢出,高位补0
// 例如 -5换算成二进制后为:0101 取反加1为1011
// 1111 1111 1111 1111 1111 1111 1111 1011
// 我们分别对5进行右移3位、 -5进行右移3位和无符号右移3位:
System.out.println(5 >> 3);// 结果是0 System.out.println(-5 >> 3);// 结果是-1
System.out.println(-5 >>> 3);// 结果是536870911
System.out.println(-1 >>> 1);// 结果是2147483647 最大int值
// 4、位与( & )
// 位与:第一个操作数的的第n位于第二个操作数的第n位如果都是1, 那么结果的第n为也为1,否则为0
// 5:0101
// 3:0011
// =0001
System.out.println(5 & 3);
// 结果为1 System.out.println(4 & 1);// 结果为0
// 5、位或( | ) 只有两个操作数对应位同为1时,结果为1,其余全为0
// 5:0101
// 3:0011
// = 0111
System.out.println(5 | 3);// 结果为7
// 6、位异或( ^ )
// 第一个操作数的的第n位于第二个操作数的第n位相反,那么结果的第n为也为1,否则为0
// 5:0101
// 3:0011
// = 0110
System.out.println(5 ^ 3);//结果为6
// 7、位非( ~ )
// 操作数的第n位为1,那么结果的第n位为0,反之。
System.out.println(~5);// 结果为-6
}```