应用按位与操作拆分字节
对于一个多字节的无符号整数,如由四个字节组成的整数A,用二进制表示为A1A2A3A4这四个字节,现在希望将这四个字节拆分出来,得到每一个字节所表示的十进制数字。针对这个问题首先可以应用按位与操作将非当前字节都转化为0,以保留当前字节,例如,针对上述整数A,假设需要拆分出字节A2则可将字节A1、A3和A4内的数字都变为0得到新数字A’=0A200(注:其中0代表一个字节为0)。然后将所保留的当前字节挪到第一个字节的位置就可以得到拆分出来的字节所表示的十进制数字,沿用上述例子,字节A2所表示的十进制数A2’=000A2(注:其中0代表一个字节为0)。
现在用一个更具体的例子来说明这种字节拆分方法。将由三个字节,每一个字节八位的十进制整数10052611的每一个字节拆分出来。数字10052611的二进制结构下图所示,下面对B1字节、B2字节和B3字节分别进行拆分。
拆分B3字节,为此需要将B1字节和B2字节都置为0。按位与计算只有当两个数对应位置上的值都为1时,其计算结果才为1,否则为0。通过构造一个二进制数C,使其为三个字节,并且将前两个字节都设定为0,最后一个字节的所有位都设定为1。然后将C和B进行按位与操作来实现对B3字节的保留,如下图所示。
将按位与的结果直接转为十进制数就可以得到B3字节所表示的十进制数位:3。
拆分B2字节,和拆分B3字节类似,构造一个二进制数C,使其为三个字节,将除中间一个字节外的两外两个字节都设定为0。将原来的数字B与C做按位与运算,过程和结果如下图所示。
我们得到的结果为000000000110010000000000这个二进制数,虽然将除目标字节(即B2)之外的其他字节都变为了0,可是将这个结果转成十进制数时,得到的是25600,可是我们希望得到的数字是由01100100字节所表示的十进制数100。这是因为字节B2还处在自己原来所处的位置上,需要我们将按为与所得到的结果中的B2字节整体向低位移动8位。由于将十进制数除以2就相当于二进制中的所有非0位向低位移动一位,因此将按位与所得到的结果除以28即可以得到我们想要的结果。参照B2字节的分离过程,B1字节的分离过程便不再赘述。
本博客为博主原创博客,转载请注明出处,谢谢!