仅使用位掩码确定偏移量

时间:2016-04-02 19:09:14

标签: c++ c bit-manipulation bitwise-operators bit-shift

您好'我遇到了问题

每个遥测频道都有一些用单词(或双字)和位掩码打包的遥测值。

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

之后&操作我得到了0x2000,但是这个字中打包的真实遥测值是0x2(0x2000>> 12)。如何仅使用蒙版确定此偏移,并且不使用循环:

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

2 个答案:

答案 0 :(得分:1)

我认为你可以使用一些内置函数来获得第一个非零位索引。例如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

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

答案 1 :(得分:0)

也许你可以看看内在函数来执行&#34;扫描&#34;。指令&#34; int _bit_scan_forward(int)&#34;应该做的伎俩;)

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