博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java中的左移时的负数问题
阅读量:4038 次
发布时间:2019-05-24

本文共 1202 字,大约阅读时间需要 4 分钟。

java 中的左移的运算符为<<,其作用是返回把左侧的数字左移右侧数字的位数的结果,其规则为:丢弃最高为,0补最低位。因此,左移可以用作乘2操作的一个高效的实现。

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

public void shiftTest() {
int n = 1; while (n != 0) {
n = n << 1; System.out.println(Integer.toBinaryString(n)); }}

输出:

101001000100001000001000000100000001000000001000000000100000000001000000000001000000000000100000000000001000000000000001000000000000000100000000000000001000000000000000001000000000000000000100000000000000000001000000000000000000001000000000000000000000100000000000000000000001000000000000000000000001000000000000000000000000100000000000000000000000001000000000000000000000000001000000000000000000000000000100000000000000000000000000001000000000000000000000000000001000000000000000000000000000000100000000000000000000000000000000

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

首先是倒数第二行,我们把数字每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。

转载地址:http://tmsdi.baihongyu.com/

你可能感兴趣的文章
arm 自动升级脚本
查看>>
RS232 四入四出模块控制代码
查看>>
gstreamer插件之 videotestsrc
查看>>
autoupdate script
查看>>
linux 驱动开发 头文件
查看>>
/etc/resolv.conf
查看>>
container_of()传入结构体中的成员,返回该结构体的首地址
查看>>
linux sfdisk partition
查看>>
ipconfig,ifconfig,iwconfig
查看>>
opensuse12.2 PL2303 minicom
查看>>
电平触发方式和边沿触发的区别
查看>>
网络视频服务器移植
查看>>
Encoding Schemes
查看>>
移植QT
查看>>
如此调用
查看>>
计算机的发展史
查看>>
带WiringPi库的交叉编译如何处理一
查看>>
带WiringPi库的交叉笔译如何处理二之软链接概念
查看>>
Spring事务的七种传播行为
查看>>
ES写入找不到主节点问题排查
查看>>