Java 移位操作符

移位操作符操作的运算对象是二进制的“位”。移位操作符只可用来处理整数类型。

  1. 左移位操作符(<<):按照操作符右侧指定的位数将操作符左边的操作数向左移动(在低位补0)
  2. “有符号”右移位操作符(>>):按照操作符右侧指定的位数将操作符左边的操作数向右移动,“有符号”右移位操作符使用“符号扩展”,若符号为正,则高位插入0;若符号为负,则在高位插入1
  3. “无符号”右移位操作符(>>>):使用“零扩展”,无论正负,都在高位插入0

如果对char、byte或者short类型的数值进行移位处理,那么在移位进行之前,会被转成int型,并且得到的结果也是int型。只有数值右端的低5位才有用。若对long型的数值进行处理,最后得到的结果也是long型,此时只会用到数值右端的低6位,以防止移位超过long型数值具有的位数。

“移位”可以和“等号”(<<= 或 >>= 或 >>>= )组合使用。操作符左边的值会移动由右边的值指定的位数,再将得到的结果赋值给左边的变量。但是,在进行“无符号”右位移结合赋值操作时,对byte或short值进行这样的移位运算,得到的可能不是正确的结果。它们先被转换成int类型,再进行右移操作,然后被截断,赋值给原来的类型,这就可能会得到-1的结果,例:

public static void main(String[] args) {
		int i = -1;
		System.out.println(Integer.toBinaryString(i));
		i >>>= 10;
		System.out.println(Integer.toBinaryString(i));

		long l = -1L;
		System.out.println(Long.toBinaryString(l));
		l >>>= 10;
		System.out.println(Long.toBinaryString(l));

		short s = -1;
		System.out.println(Integer.toBinaryString(s));
		s >>>= 10;
		System.out.println(Integer.toBinaryString(s));
		
		byte b = -1;
		System.out.println(Integer.toBinaryString(b));
		b >>>= 10;
		System.out.println(Integer.toBinaryString(b));
		
		b=-1;
		System.out.println(Integer.toBinaryString(b));
		System.out.println(Integer.toBinaryString(b >>> 10));
	}

输出结果:

最后一个移位运算中,结果没有赋给b,而是直接打印出来,所以它的结果是正确的。

应用涉及“按位”操作的所有操作符:

public static void main(String[] args) {
		Random random = new Random(47);
		
		System.out.println("-1" + ",int:" + -1 + ",二进制:" + Integer.toBinaryString(-1));
		System.out.println("1" + ",int:" + 1 + ",二进制:" + Integer.toBinaryString(1));
		
		int maxp = 2147456895;
		System.out.println("maxp" + ",int:" + maxp + ",二进制:" + Integer.toBinaryString(maxp));
		int maxn = -244746123;
		System.out.println("maxp" + ",int:" + maxn + ",二进制:" + Integer.toBinaryString(maxn));
		
		int a = random.nextInt();
		int b = random.nextInt();
		System.out.println("a" + ",int:" + a + ",二进制:" + Integer.toBinaryString(a));
		System.out.println("~a" + ",int:" + ~a + ",二进制:" + Integer.toBinaryString(~a));
		System.out.println("-a" + ",int:" + -a + ",二进制:" + Integer.toBinaryString(-a));		
		System.out.println("b" + ",int:" + b + ",二进制:" + Integer.toBinaryString(b));
		System.out.println("a&b" + ",int:" + ((Integer)a&b) + ",二进制:" + Integer.toBinaryString(a&b));
		System.out.println("a|b" + ",int:" + ((Integer)a|b) + ",二进制:" + Integer.toBinaryString(a|b));
		System.out.println("a^b" + ",int:" + ((Integer)a^b) + ",二进制:" + Integer.toBinaryString(a^b));
		System.out.println("a << 5" + ",int:" + ((Integer)a << 5) + ",二进制:" + Integer.toBinaryString(a << 5));
		System.out.println("a >> 5" + ",int:" + ((Integer)a >> 5) + ",二进制:" + Integer.toBinaryString(a >> 5));
		System.out.println("~a >> 5" + ",int:" + ((Integer)~a>>5) + ",二进制:" + Integer.toBinaryString(~a >> 5));
		System.out.println("a >>> 5" + ",int:" + ((Integer)a >>> 5) + ",二进制:" + Integer.toBinaryString(a>>>5));
		System.out.println("~a >>> 5" + ",int:" + ((Integer)~a>>>5) + ",二进制:" + Integer.toBinaryString(~a >>> 5));
		
		
		System.out.println("-1L" + ",long:" + -1L + ",二进制: " + Long.toBinaryString(-1L));
		System.out.println("1L" + ",long:" + 1L + ",二进制: " + Long.toBinaryString(1L));
		
		long g = 9223654126341L;
		System.out.println("g" + ",long:" + g + ",二进制: " + Long.toBinaryString(g));
		long h = -9245187518487L;
		System.out.println("h" + ",long:" + h + ",二进制: " + Long.toBinaryString(h));
		
		long c = random.nextLong();
		long f = random.nextLong();
		System.out.println("c" + ",long:" + c + ",二进制: " + Long.toBinaryString(c));
		System.out.println("~c" + ",long:" + ~c + ",二进制: " + Long.toBinaryString(~c));
		System.out.println("-c" + ",long:" + -c + ",二进制: " + Long.toBinaryString(-c));
		System.out.println("f" + ",long:" + f + ",二进制: " + Long.toBinaryString(f));
		System.out.println("c&f" + ",long:" + ((Long)c&f) + ",二进制: " + Long.toBinaryString(c&f));
		System.out.println("c|f" + ",long:" + ((Long)c|f) + ",二进制: " + Long.toBinaryString(c|f));
		System.out.println("c^f" + ",long:" + ((Long)c^f) + ",二进制: " + Long.toBinaryString(c^f));
		System.out.println("c<<5" + ",long:" + ((Long)c<<5) + ",二进制: " + Long.toBinaryString(c<<5));
		System.out.println("c>>5" + ",long:" + ((Long)c>>5) + ",二进制: " + Long.toBinaryString(c>>5));
		System.out.println("~c>>5" + ",long:" + ((Long)~c>>5) + ",二进制: " + Long.toBinaryString(~c>>5));
		System.out.println("c>>>5" + ",long:" + ((Long)c>>>5) + ",二进制: " + Long.toBinaryString(c>>>5));
		System.out.println("~c>>>5" + ",long:" + ((Long)~c>>>5) + ",二进制: " + Long.toBinaryString(~c>>>5));
	}

输出结果:

利用int或long型的参数,然后用二进制格式输出,对int和long的所有按位操作符的作用,上面结果显示了int和long的最小值、最大值、+1和-1值,还有它们的二进制形式,注意最高位表示符号:0为正,1为负,数字的二进制表示形式称为“有符号的二进制补码”

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值