为了账号安全,请及时绑定邮箱和手机立即绑定

左移运算探讨求解

视频8:55(左右)的时候,讲师说 -14的高位包含1,不符合乘以2的规则,我认为说错了,负数左移应该以0为标准,而-14左移两位,舍弃的高位不包含0,所以乘2规则依然适用

这样的理解有没有错?

正在回答

3 回答

      看来这位童鞋是强迫症犯了。。。你只需要记住相对于二进制数而言的,左移一位,相当于最后一位加一个零,即将数扩大2^1倍,左移n位,即加n个零,扩大2^n次方,然而这仅限于无符号数的运算,有符号数就要考虑高位溢出了。乘法运算是一步一步乘(移位)出来的,每次取乘数的一位与被乘数操作,1则把被乘数照写,0则为0,然后乘数右移。这样循环,最后把每一步结果加起来。所以左移位比乘法效率要高(具体参见<<计算机组成原理>>),你可以在java上写个小程序看看两者的运算时间。

0 回复 有任何疑惑可以回复我~
#1

泡面大减价 提问者

有无符号的运算都要考虑高位的溢出,只有在无溢出的的情况下才符合 乘2 规则,只不过有符号运算多了一种情况,如:正数00...0010101 当把前面的 0 全部去掉时,会变成一个负数(1010100....0)造成一种变相的溢出, 负数也同样的情况,但在无溢出情况下,乘2规则是使用的
2016-10-17 回复 有任何疑惑可以回复我~
#2

泡面大减价 提问者 回复 泡面大减价 提问者

适用的
2016-10-17 回复 有任何疑惑可以回复我~
#3

SkyFreecss 回复 泡面大减价 提问者

你已经解释的挺详细了,我前面说得关于左位移有无符号数的情况确实有问题,谢谢指正!^-^
2016-10-17 回复 有任何疑惑可以回复我~

无符号不用考虑吧,毕竟无符号进一位,如1000进一位会变成0001 0000,而有符号的则并不是这样子的吧,如1001进一位,会变成00010010,一个是有小变大了,一个是不仅变大了,还把符号给改了

0 回复 有任何疑惑可以回复我~
#1

泡面大减价 提问者

每个数据类型都有一个固定的大小,比如byte是1个字节,也就是8位,如果byte类型数据 0001 0000左移大于3位,1被移出8位之内,变成 0000 0000,造成溢出
2016-10-23 回复 有任何疑惑可以回复我~
#2

蝶梦疏妄 回复 泡面大减价 提问者

你说的溢出是这种溢出啊
2016-10-24 回复 有任何疑惑可以回复我~
#3

泡面大减价 提问者 回复 蝶梦疏妄

这种是数据左移超出范围,造成丢失所产生的溢出
2016-10-25 回复 有任何疑惑可以回复我~

你错了,不符合乘2规则,会有溢出!

0 回复 有任何疑惑可以回复我~
#1

泡面大减价 提问者

请您看视频14:18,结果为-56,难道说 -14 * 4 != -56
2016-10-14 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消
二进制基础
  • 参与学习       99871    人
  • 解答问题       210    个

二进制是计算机唯一能识别的语言,是学习计算机技术必备的知识

进入课程

左移运算探讨求解

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信