社区
Java SE
帖子详情
关于移位运算符号的几个模糊的地方
max_min
2005-07-09 09:24:43
大家都知道java有关整数的移位运算符有三个<< ,>>, >>>。但是我看了几本书对他们都是一带而过有一个问题一直困扰着我。
书上都说〈〈右移动n位这个运算是起到2的n次方的作用,但是显然如果移出去的位里有1的话结果就不会增大2的n次方的作用了,其结果就是不可预测的,但是我看了java核心技术和java编程思想都没有涉及这个问题,都是一带说是增大2的n次方的作用。显然这个两个〉〉 , >>>也有移出的位有1的话错误的问题。
希望指点,谢谢!
...全文
425
15
打赏
收藏
关于移位运算符号的几个模糊的地方
大家都知道java有关整数的移位运算符有三个<>, >>>。但是我看了几本书对他们都是一带而过有一个问题一直困扰着我。 书上都说〈〈右移动n位这个运算是起到2的n次方的作用,但是显然如果移出去的位里有1的话结果就不会增大2的n次方的作用了,其结果就是不可预测的,但是我看了java核心技术和java编程思想都没有涉及这个问题,都是一带说是增大2的n次方的作用。显然这个两个〉〉 , >>>也有移出的位有1的话错误的问题。 希望指点,谢谢!
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
15 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
njwangchuan
2005-07-10
打赏
举报
回复
昨天说的有个重大错误,负数右移的时候如果出现全1说明超出了机器的表示范围,特此更正!
interhanchi
2005-07-10
打赏
举报
回复
java里面的移位,就是用补码来移位的!也就是补码移位.
fishland
2005-07-10
打赏
举报
回复
"书上都说〈〈右移动n位这个运算是起到2的n次方的作用,但是显然如果移出去的位里有1的话结果就不会增大2的n次方的作用了,其结果就是不可预测的,.."
首先纠正楼主错误,‘<<’为左移符号。是这样的,左移在补码中只是在末尾加0,起到扩大2的n次方的作用。
比如101这个二进制数,也就是5(十进制),左移一位后变为1010,十进制是10,起到了x2的作用。这里所说的“如果移出去的位里有1的话结果就不会增大2的n次方的作用了,其结果就是不可预测的”是指:如果对数的长度有要求,比如只能用3位二进制表示整数,还用上面的例子101,移动一位后是010,第一个1已经移出去,结果是2(十进制),没有扩大2倍,所以他说其结果就是不可预测的。
而楼主下面的话:
"显然这个两个〉〉 , >>>也有移出的位有1的话错误的问题。" 是错误的。因为右移和左移的规律是不同的,移位后的第一位是“按符号移动”,就不会出现以上问题。
所以,楼主的书上所言是完全正确的。
还要说明一点,一定要清楚数字在机器内部是按补码存储的,比如 int a=5,在内部,已经存储为00000000000000000000000000000101(32位),而不用你做任何转换。
土豆丝炒肉2005
2005-07-10
打赏
举报
回复
关于移位操作
<< 往左移 是1补1,是0补0。 左移n位就是乘以2的n次方。
>> 往右移 是1补1,是0补0。 右移n位就是除以2的n次方。
>>> 无符号右移 始终补0。
max_min
2005-07-10
打赏
举报
回复
感谢个位的回复,昨天在机器上狂试验了一下,感觉应该是这么回事情。
首先说<<左移。别说左移出二进制1会出问题,就是左移出0的话超出变量的表示范围也一样会出问题
也就是说,左移的前提是不要超出数的表示范围的话,2的n次方这个结论还是正确的。例子是int x=0x8fffffff;x<<1(超出数的表示范围)。之所以会犯我以前认识上的错误,是因为写成十进制后忽略了前面有那么多零比如说int i=5;事实上因为int有32位存储,要左移29次的话才会超出范围。但是>>就不一样了很容易就能把二进制1移出去这样得到的结果其实是整除2的n次方的结果
Goldrush
2005-07-10
打赏
举报
回复
借问c语言中->是做什么用的?
奇伢
2005-07-09
打赏
举报
回复
路过,这些我以前也都学习过
njwangchuan
2005-07-09
打赏
举报
回复
有很重要的一点楼主没有搞清楚,就是机器数的存放是用补码.
1、正数移动。正数由于首位是零,所以在没有溢出的情况,左移末位补0,右移首位补0。如果左移后首位,变1,这个数就变成负数了了,说明正溢出了。右移动如果全变0,说明这个数已经小于机器数可表示范围(int型小于1大于0了)
2、负数移动。规则基本类似,左移的时候末位补0,如果首位变0,说明此数负溢出,右移的时候首位保持1,如果除了首位其他都是0,说明此数已经超出表示范围(int型小于0大与-1)
应该够详细了吧
kingfish
2005-07-09
打赏
举报
回复
System.out.println(Integer.toHexString(0xFFFFFFFF >>> 8));//>>>无符合右移,填0,所以结果是0x00FFFFFF
System.out.println(Integer.toHexString(0xFFFFFFFF >> 8));//>>有符合右移(符号高位决定),,所以结果是0xFFFFFFFF ,即 -1
System.out.println(Integer.toHexString(0x000000FF<< 8));//左移,,所以结果是0xFFFFFF00
max_min
2005-07-09
打赏
举报
回复
夜雨兄弟如果真懂的话你就说说详细,我在网上查了很多资料没找到,在这里先谢了
max_min
2005-07-09
打赏
举报
回复
congliu()你好
你说的话我明白事实上如果作为int形的变量,左移n位的话,java自动对n取模32(因为int一共有32位,如果是long形就取模64)如果调试int i;i<<34和i<<2结果i都会是4。但是显然作为int的01011110000000000000000000000000左移两位结果就不对了,而且它也没出他的表示范围,楼上有的兄弟回答的太草率
max_min
2005-07-09
打赏
举报
回复
不是带不带符号的问题,比如说二进制正数01011110左移两位的结果是多少,肯定不是简单的增大或缩小2的2方的问题
congliu
2005-07-09
打赏
举报
回复
楼主说得没错,但是<<使用时有个前提,就是运算的结果必须在进行运算的对象的取值范围内,所以楼主所说的 “显然如果移出去的位里有1的话结果就不会增大2的n次方的作用了,其结果就是不可预测的” 是不准确的。
yeyu710
2005-07-09
打赏
举报
回复
带符号的运算,它还有一个标识位的啊
yeyu710
2005-07-09
打赏
举报
回复
呵呵,这个问题可到到一般的计算机基础知识的书上就可以找到了啊!
Java的移位运算
前言 计算机支持两种移位运算,分别是向左移位 x << k 和向右移位x >> k,左移位会对输入的操作数舍弃最高的k位,并在右端补k个0。而右移位运算却分为两种情况,分别是逻辑右移和算术右移(也叫无符
号
右移和符
号
右移),在逻辑右移中,会对操作数舍弃最低的k位,并在左端补k个0,在算术运算中,则对操作数舍弃最低的k位,并在左端补k个最高有效位的值。 对于有符
号
数来说,最高位有效值是不同的,所以逻辑右移和算术右移将产生不同的效果,而C语言并没有明确定义有符
号
数该使用哪种类型的右移.
2.2.2 定点数的移位运算
XYXZNB(*^ワ^*)*\(^o^)/* 我们已经知道了定点数在计算机内部如何表示分为无符
号
数和有符
号
数啊,其中有负
号
数可以用元码补码,反码和移码这样的4种方式来表示,那么从这个小节开始,我们要学习定点数的相关的运算,应该怎么实现分为移位运算,还有加法减法运算,乘法运算,除法运算,其中一位运算和加减运算的考察频率是更高的,那这一小节中我们先来学习定点数的一倍运算,怎么实现那移位运算,又可以进一步的划分为算术移位,逻辑移位,还有循环移位,我们会按从上至下的顺序依次讲解,好,那首先来认识一下什么...
C语言中的移位运算乘法,C语言中 移位操作运算
移位规律:左移时总是移位和补零。右移时无符
号
数是移位和补零,此时称为逻辑右移;而有符
号
数大多数情况下是移位后补最左边的位(也就是补最高有效位),移几位就补几位,此时称为算术右移。(其实跟扩展逻辑一样)。C语言中的移位操作,内容不多。不过有些
地方
你不注意,就疏忽了。先做两个小题先。(1)unsigned char x=3;x<<1是多少?x>>1是多少?(2)char x=3...
移位运算、位运算、逻辑运算相关知识点及笔试题
hello,大家好,今天我为大家带来的是移位运算、位运算以及逻辑运算,为了方便大家理解和掌握这三个知识点,我会在文章中附上一系列的图解和练习题,Let is go ! 🚀🚀🚀 @TOC 🚀原码、反码、补码 我们知道计算机只能识别二进制数据,所以整数要存入计算机中就必须转化为相应的二进制数,同时整数在内存中的二进制表现形式有三种,分别是原码、反码和补码。在内存中,计算机对数据进行运算的时候用的都是整数的补码。 对于正整数来说:原码 = 反码 = 补码; 对于负整数来说:原码符
号
位不变、其他位按位取反得.
移位运算(转)
C++位运算,看高手都是运用的灵活自如,打算从今天开始学习他!收藏 每次看到位运算的
地方
,都比较迷糊.以前学习C的时候也不求甚解,到现在看来,觉得位运算和指针在C++基本知识里是最难理解,最难融会贯通的东西.尤其是位运算,用好了可以"出神入化"了^_^. 如果当年好好学习C语言,也不至于今天这么费劲! 位运算 位运算的运算分量只能是整型或字符型数据,位运算把运算对象
Java SE
62,617
社区成员
307,307
社区内容
发帖
与我相关
我的任务
Java SE
Java 2 Standard Edition
复制链接
扫一扫
分享
社区描述
Java 2 Standard Edition
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章