java 左移负数_Java中的左移时的负数问题

java 中的左移的运算符为<

但是使用的时候要注意符号位的问题,如下:

public void shiftTest() {

int n = 1;

while (n != 0) {

n = n << 1;

System.out.println(Integer.toBinaryString(n));

}

}

输出:

10

100

1000

10000

100000

1000000

10000000

100000000

1000000000

10000000000

100000000000

1000000000000

10000000000000

100000000000000

1000000000000000

10000000000000000

100000000000000000

1000000000000000000

10000000000000000000

100000000000000000000

1000000000000000000000

10000000000000000000000

100000000000000000000000

1000000000000000000000000

10000000000000000000000000

100000000000000000000000000

1000000000000000000000000000

10000000000000000000000000000

100000000000000000000000000000

1000000000000000000000000000000

10000000000000000000000000000000

0

这里需要关注的是最后两行的输出。

首先是倒数第二行,我们把数字每4位分隔开来看,为1000 0000 0000 0000 0000 0000 0000 0000,回想一下,Java中的int型的数据是32位的有符号数,并且第一位为符号位,而当前这个数字已经显示为32位了,因此说明初始的1已经被位移到了整个int的首位,也就是符号位,此时,这个数字已经变成了一个负数,并且值为Java中int的最小值:-2147483648。

而最后一行,说明此时,1在被位移至整个int的最左边之后,再次左移,此时被移除了整个数字,而整个数字变为了0。

还有一点要注意的是,Java中int的位数为32,因此若左移运算符右侧的数字大于32的话,实际运算的位移的位数为其对32取余的数字。

如:

n = 1;

System.out.println(n << 33);

输出:

2

因为33 % 32 = 1,所以,实际结果为将1 左移1位的结果,即2。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值