您好'我遇到了问题
每个遥测频道都有一些用单词(或双字)和位掩码打包的遥测值。
例如,我有掩码0xf000和字值0x2499之后&操作我得到了0x2000,但是这个字中打包的真实遥测值是0x2(0x2000>> 12)。如何仅使用蒙版确定此偏移,并且不使用循环:
offset = 0;
for (int i = 0;i<32 i++)
{
if ((mask>>i)&1)
{
offset = i
break;
}
}
答案 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