Java移位运算

1.java中无符号右移>>>,long型每64位一个循环,int型每

       public static void main(String[] args) {

		
		//long型无符号右移64位一个循环
		long a = 33;
		for (int i = 0; i < 65; i++) {
			System.out.println(i + " " + (a >>> i));
		}
		
		//int型无符号右移32位一个循环
		int b = 33;
		for (int i = 0; i < 33; i++) {
			System.out.println(i + " " + (b >>> i));
		}
		
		
	}

只有无符号右移这种运算操作,没有<<<这种操作。

2.正数与负数的移位运算

>>

有符号右移,移位后,正数左边补0,负数左边补1

<<

移位时,带着符号一起移动,右侧都补0

>>>

不管正负,左侧统一补0,所以负数无符号右移后,变为正数

示例代码如下:

/**
	 * 补码就是负数在计算机中的二进制表示方式
	 * 一个整数按照绝对值大小转换为二进制,是为原码,原码取反再加1是为补码
	 * -7
	 * 00000000 00000000 00000000 0111
	 * 取反
	 * 11111111 11111111 11111111 1000
	 * 加1
	 * 11111111 11111111 11111111 1001
	 */
	@Test
	public void test8() {
		/**
		 * 正数移位,>>移位,左侧补0,<<移位,右侧补0
		 * 负数移位,>>移位,左侧补1,<<移位,右侧补0
		 * <<移位,不管正数还是负数,统一带着符号一起移动
		 * 
		 */
		int i = 7;
		System.out.println(Integer.toBinaryString(i));//111
		System.out.println(Integer.toBinaryString(i >> 1));//011即3
		System.out.println(Integer.toBinaryString(i << 1));//1110
		int b = -7;
		System.out.println(Integer.toBinaryString(b));//1111 1111 1111 1111 1111 1111 1111 1001
		System.out.println(Integer.toBinaryString(b >> 1));//1111 1111 1111 1111 1111 1111 1111 1100
		System.out.println(Integer.toBinaryString(b << 1));//11111111111111111111111111110010
		System.out.println(Integer.toBinaryString(b >>> 1));//0111 1111 1111 1111 1111 1111 1111 1100
	}

参考:https://blog.csdn.net/u014110320/article/details/83037130

           https://sickworm.com/?paged=4

你可能感兴趣的:(Java)