为什么一个十六进制数%256可以得到低8位,/256得到高8位?

它跟移位有什么区别和联系吗?
关注者
10
被浏览
77,058

4 个回答

上面三位老哥的答案很清晰,甚至有一点深度。

我尽量简单清晰的回答一遍:

请看下图,请问它代表的十进制数是多少呢?

有个简单的方法可以求得:

按照位置顺序,标识数字。从1开始翻倍往上增加进行标识,如下:

最后把为【1】的标识相加:1+4+16+64+256+1024+4096+16384得到结果为:21845。如下图:

细心的老爷肯能已经发现了,高8位的第一个位,也就是上图红框位置,我们标的标识是【256】。原因也非常简单,因为只有8位长度的二进制最多可以储存的无符号十进制数是【255】。

比如IPv4地址最大只能设置成255,比如RS485最大只支持255个从站。

显而易见的,如果想得到一个数的低8位,只需要将这个数除以256并取其余数,那么取得的余数就是该数的低八位。因为大于256的部分全部都是属于高八位的。

相反的,将这个数除以256并舍弃余数,那么得到的值就是该数的高八位。


接一句题外话,上述截图是通过W10自带计算器完成,附图:



你的问题应该有误,应该是“一个十六位二进制数”才对。

256,2的8次方,相当于十进制中的百,千,万等进制数(10)的整数次方。

你可以这样类比理解:

为什么(十进制中)一个两位数%10可以取得个位数,除以十能得到十位数?

这样理解是不是简单多了?再把这种理解带入二进制数中,答案就出来了!

一般来说,计算机中,获取高8位与低8位,不是这样算的,这样算效率太低。

获得高8位,只用把这个数右移8位。

比如0xaabb右移8位,0xaabb>>8,就是0x00aa。

获取低8位,只用这个数与0x00ff按位相与。

比如0xaabb和0x00ff按位相与,0xaabb & 0x00ff,结果就是0x00bb。0x00ff,前8位是0,后8位是1,任意数与0相与为0,与1相与不变,于是就清零了前8位,保留了后8位,得到0xbb。

移位与按位与操作的速度要比取余和除法操作快很多,所以效率要高很多