这是我在C程序中看到的代码,我知道这段代码是在与位字符c对应的位位图中设置一个位。
field[ (c & 0x7f) >> 3 ] |= 1 << (c & 0x07);
field是一个16个字符的数组,每个字符是8位。
例如'97'是小写'a',如果我们将c设置为97,那么位位置97将被设置为1.
任何人都知道为什么上面的代码会设置对应于字符c的位图? 什么是幻数0x7f,0x07,3和1?
答案 0 :(得分:6)
如果您的数组长度为16个字节,则它具有128位(16 x 8)。所以第一个掩码(0x7f)保证你只对前128个字符感兴趣。一旦你向右移3位,你剩下4位用于寻址你的位域(数字((c&amp; 0x7F)&gt;&gt; 3是0到15之间的数字。)所以这部分使用了鞋面4位用于寻址字节。
现在,您需要寻址字节中的位,因此您使用掩码0x07将值限制在0 - 7范围内(对应于位0到7)。你使用这个数字来移动1个这么多的位置。
最后,您将位设置为0到127(16位,8位)。我希望这有帮助!
答案 1 :(得分:2)
首先,要清除幻数
0x7f
是二进制的0111 1111
。这意味着c的低7位是重要的。然后将其移位3,以便只有原始0xxx x000
(4)位是重要的。但由于这些位移3,因此计数为0到15。
0x07
是二进制的0000 0111
。这意味着只有低3位是重要的。数字1向左移动这3位中的值,从而在字节内的位位置0到7中设置一个位。
最后,该函数仅使用字节中的低7位,这是ascii字符中唯一的有效位。它使用高4来寻址数组中的字节,使用低3来寻址寻址字节中的位。