用C++解释Bit Test宏

Ban*_*gas 3 c++ testing macros bit c-preprocessor

我试图弄清楚这段代码是如何工作的,但我无法得到一个答案.

#define testbit(x, y)  ( ( ((const char*) & (x))[(y)>>3] & 0x80 >> ((y)&0x07)) >> (7-((y)&0x07) ) )
Run Code Online (Sandbox Code Playgroud)

我是新手,所以如果你能找到一种用简体英语解释的方法,我会非常感激.

它属于X-Plane插件的一段代码,位于https://code.google.com/p/xplugins/source/browse/trunk/Xsaitekpanels/SwitchPanel.cpp?r=38 line = 19

Rhy*_*man 7

宏测试y-th位的值x.你不能直接寻址位,所以代码开始时x视为一个字节数组(转换const char*).

然后它查找位所在的字节.一个字节有8位,所以它除以8.追逐性能,而不是简单地除以8,代码使用右移3位的二进制技巧.在一般情况下,无符号xy,x >> y = x/2^yx << y = x*2^y.

此时,您需要测试字节中的位,以便获得剩余部分y/8.又一个小技巧,使用y & 7而不是更清晰y % 8.

通过这些信息,您可以制作一个掩码,一个单独的位,0x80并将其移动到位以测试y%8第一位.掩码与字节进行AND运算,此处的非零结果表示该位设置为1,否则为0.