use*_*449 5 c macros c-preprocessor
我想要一个函数或(最好)一个宏来计算获得特定位掩码所需的移位数。
目前我正在做类似的事情:
#define CURRBITMASK 0x30
#define CURRBITSHIFT 4
Run Code Online (Sandbox Code Playgroud)
我想做的事:
#define BITMASK1 0x10
#define BITSHIFT1 GETSHIFT(BITMASK1) // 4 ; 0x10 = (0x1 << 4)
#define BITMASK2 0x18
#define BITSHIFT2 GETSHIFT(BITMASK2) // 3 ; 0x18 = (0x3 << 3)
#define BITMASK3 0xC0
#define BITSHIFT3 GETSHIFT(BITMASK3) // 6 ; 0xC0 = (0x3 << 6)
#define BITMASK4 0x40
#define BITSHIFT4 GETSHIFT(BITMASK3) // 6 ; 0x40 = (0x1 << 6)
Run Code Online (Sandbox Code Playgroud)
有没有什么方法可以仅使用宏从掩码中获取所需的移位?如果没有,是否有比这更优化的方法来将其作为函数来实现?:
int get_shift(int bitmask) {
int count = 0;
while (bitmask & 0x1) {
bitmask >>= 1;
count++;
}
return count;
}
Run Code Online (Sandbox Code Playgroud)
您的实现相当于计算数字中尾随零的数量。
这里描述了几种执行此操作的方法。其中一个示例通过七个步骤对 32 位数字执行此操作:
unsigned int v; // 32-bit word input to count zero bits on right
unsigned int c = 32; // c will be the number of zero bits on the right
v &= -signed(v);
if (v) c--;
if (v & 0x0000FFFF) c -= 16;
if (v & 0x00FF00FF) c -= 8;
if (v & 0x0F0F0F0F) c -= 4;
if (v & 0x33333333) c -= 2;
if (v & 0x55555555) c -= 1;
Run Code Online (Sandbox Code Playgroud)