java位运算


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
	}```

相关