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
宏测试y
-th位的值x
.你不能直接寻址位,所以代码开始时x
视为一个字节数组(转换const char*
).
然后它查找位所在的字节.一个字节有8位,所以它除以8.追逐性能,而不是简单地除以8,代码使用右移3位的二进制技巧.在一般情况下,无符号x
和y
,x >> y = x/2^y
和x << y = x*2^y
.
此时,您需要测试字节中的位,以便获得剩余部分y/8
.又一个小技巧,使用y & 7
而不是更清晰y % 8
.
通过这些信息,您可以制作一个掩码,一个单独的位,0x80
并将其移动到位以测试y%8
第一位.掩码与字节进行AND运算,此处的非零结果表示该位设置为1,否则为0.