我正在寻找一种高效的(最好是宏)方法来提取位的位置并将其保存为C语言中的值。
data = 0x4000
请提供需要翻译的具体内容。
pos = 14
我读取的16位寄存器中只有一个位被设置。目前,我只是通过比较数据与位移值来提取位置,但肯定有更好的方法我不知道。
我花了一些时间在这里搜索类似的问题,但没有找到。
我正在寻找一种高效的(最好是宏)方法来提取位的位置并将其保存为C语言中的值。
data = 0x4000
请提供需要翻译的具体内容。
pos = 14
我读取的16位寄存器中只有一个位被设置。目前,我只是通过比较数据与位移值来提取位置,但肯定有更好的方法我不知道。
我花了一些时间在这里搜索类似的问题,但没有找到。
跨平台解决方案是最具可移植性和有效性的,但也比较悲观;许多现代处理器都具有像这样的位操作指令和内置函数。
例如,x86-64具有bsf
指令,它将在另一个操作数中填充最高有效位的位置:
bsf eax, 0x00004000
; eax now holds the value '14'
int MSBPos = 0;
while(data && !(data & 1)) // 'data' check avoids infinite loop if data is 0
{
MSBPos++;
data >>= 1;
}
switch
语句来识别哪个16位被设置。 - tadman(data & (1<<n))
的循环。 - Grégoire BOUX