c语言按位技巧

时间:2012-03-04 03:28:17

标签: c bit-manipulation

这是我在C程序中看到的代码,我知道这段代码是在与位字符c对应的位位图中设置一个位。

field[ (c & 0x7f) >> 3 ] |= 1 << (c & 0x07);

field是一个16个字符的数组,每个字符是8位。

例如'97'是小写'a',如果我们将c设置为97,那么位位置97将被设置为1.

任何人都知道为什么上面的代码会设置对应于字符c的位图? 什么是幻数0x7f,0x07,3和1?

2 个答案:

答案 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来寻址寻址字节中的位。