仅使用位掩码确定偏移量

Determine offset using only bitmask

本文关键字:偏移量 掩码      更新时间:2023-10-16

你好,有问题

有一些遥测值封装在字(或双字)和每个遥测通道的位掩码中。

例如,我有掩码0xf000和字值0x2499

在&操作我有0x2000,但这个字中的实际遥测值是0x2(0x2000>>12)。如何仅使用掩码而不使用循环来确定此偏移,如:

offset = 0;
for (int i = 0;i<32 i++)
{
    if ((mask>>i)&1)
        {
        offset = i
        break;
        }
}

我认为您可以使用一些内置函数来获得第一个非零位索引。例如GCC具有int __builtin_ffs (int x)

— Built-in Function: int __builtin_ffs (int x)
Returns one plus the index of the least significant 1-bit of x, or if x is zero, returns zero.

所以在你的情况下:

offset = __builtin_ffs(mask);

MSDN有类似的内部结构_BitScanForward_BitScanForward64

https://msdn.microsoft.com/en-us/library/wfd9z0bb.aspx

所有这些内置函数都使用特殊的汇编指令,在硬件级别上执行所需的计算。

也许您可以查看内部函数来执行"扫描"。指令"int _bit_scan_forward(int)"应该可以完成任务;)

https://software.intel.com/sites/landingpage/IntrinsicsGuide/#cats=Bit%20Manipulation