移位(左移,右移和无符号右移)

package sort;

public class Shift {

	public static void main(String[] args) {
		int x = -50;
		int a = 50;
		int b = 5;
		int m = 1;
		int c = a >> b;
		int d = a << b;
		int e = a >>> b;
		int q = x >> b;
		int p = x << b;
		int y = -10 >>> b;
		for (int i = 0; i < b; i++) {
			m *= 2;
		}
		int cc = a / m;
		int dd = a * m;
		int ee = a / m;
		int qq = x / m - 1;
		int pp = x * m;
		int yy = x / m - 1;
		System.out.println("c =" + c);
		System.out.println("cc =" + cc);
		System.out.println("e =" + e);
		System.out.println("ee =" + ee);
		System.out.println("d =" + d);
		System.out.println("dd =" + dd);
		System.out.println("q =" + q);
		System.out.println("qq =" + qq);
		System.out.println("p =" + p);
		System.out.println("pp = " + pp);
		System.out.println("y =" + y);
		System.out.println("yy =" + yy);

	}

}


 


结果:

c =1
cc =1
e =1
ee =1
d =1600
dd =1600
q =-2
qq =-2
p =-1600
pp = -1600
y =134217727
yy =-2


结论:

a为正数:

c为a右移b位的结果,cc为a除以2的b次方的结果因为c == cc,所以a右移两位相当于a除以2的b次方;

e为a无符号右移b位的结果,ee为a除以2的b次方的结果因为 e == ee,所以a无符号右移两位相当于a除以2的b次方;

d为a左移b位的结果,dd为a乘以2的b次方的结果因为d == dd,所以a左移两位相当于a乘以2的b次方。

x为负数:

q为x右移b位的结果,qq为x除以2的b次方减去1的结果因为q == qq,所以x右移两位相当于x除以2的b次方减去1;

p为x左移b位的结果,pp为x乘以2的b次方的结果因为p == pp,所以x左移两位相当于x乘以2的b次方;

y为x无符号右移的结果,从y的数值可以看出y于x无任何算术关系,所以负数无符号右移只有逻辑意义,无任何算术意义。

总结:

a << b左移位符,表示把a左移b位,在移位的时候计算机会先把a转换成二进制数进行移位,移位后在转成十进制数,

移位过程中如果a是正数就把a左移b位,并且在低位补0,如果a为负数把a左移b位,在低位补0;

所以左移就是把a(不论正负)左移b位,并且在低位补0;

a >> b右移位符,表示把a右移b位,在移位的时候计算机会先把a转换成二进制数进行移位,移位后在转成十进制数,

移位过程中如果a是正数就把a右移b位,并且在高位补0,如果a为负数把a右移b位,在高位补1;

也就是说如果为正高位补0,如果为负高位补1;

a >>> b无符号右移,把a右移b位,不论正负都要在高位补0。

a << b相当于a(不论正负)乘以2的b次方,a >> b相当于a(正数)除以2的b次方或者a(负数)除以2的b次方-1;

a>>>b相当于a(正数)除以2的b次方,如果a为负数则没有算术意义。

 

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值