这是我在C程序中看到的代码,我知道这段代码是在与字符c对应的位位图中设置一个位.
field[ (c & 0x7f) >> 3 ] |= 1 << (c & 0x07);
Run Code Online (Sandbox Code Playgroud)
field是一个16个字符的数组,每个字符是8位.
例如'97'是小写'a',如果我们将c设置为97,那么位位置97将被设置为1.
任何人都知道为什么上面的代码会设置对应于字符c的位图?什么是幻数0x7f,0x07,3和1?
如果您的数组长度为16个字节,则它具有128位(16 x 8).所以第一个掩码(0x7f)保证你只对前128个字符感兴趣.一旦你将它向右移3位,你剩下4位用于寻址你的位域(数字((c&0x7F)>> 3是0到15之间的数字).所以这部分使用高4位来寻址字节.
现在,您需要寻址字节中的位,因此您使用掩码0x07将值限制在0 - 7范围内(对应于位0到7).你使用这个数字来移动1个这么多的位置.
最后,您将位设置在0到127位(8位的16个字节).我希望这有帮助!