最新消息:20210816 当前crifan.com域名已被污染,为防止失联,请关注(页面右下角的)公众号

关于不同位移却可以得到同样余数的“特殊”被除数

工作和技术 crifan 1619浏览 0评论

关于不同位移却可以得到同样余数的“特殊”被除数

问题:关于C语言中的移位运算的一个疑问

(注:那个网站垃圾,不能正常回复,所以就写在这了)

解答:

这是由于你给的书456是个相对有点特殊的数(其实任意给一个除数,比如64,都有自己对应的特殊的数,这点后面再说)

因为456的二进制是111001000
注意,第5位和第6位,都是0,而左边开始算第一个1,是第四位的1。
而余数得到的8,实际就是01000。

此处,先将其除于32,默认应该是右移5位,由111001000变成了1110,由于此时的第六位也是0,所以,此处继续多左移一位,然后再右移对应位数,对我们所要得到的结果,是没影响的。
同理,左移4位,同样可以,只是在这个例子中,一定要保持余数是对的,即可。
而如果只是左移三位,再右移回来,之所以不可以,是因为右移三位,没有将从左边数第一个1,也就是第4位的1消除掉,也就无法得到我们此处所要的余数了。

看清了这点,就可以很容易的反推了,
如果这不是111001000,而是111000100,那么除了右移后左移4,5,6位可以,右移后左移3位也可以,因为右移三位就可以消除这个余数100,也就是4了。

这下,应该知道我开始说的,为何对于对应的除数,有很多特殊的被除数了,那是因为只要保证被除数对于的余数的最高位有0,都可以找到这类“特殊”的数的。

转载请注明:在路上 » 关于不同位移却可以得到同样余数的“特殊”被除数

发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
79 queries in 0.155 seconds, using 22.08MB memory