仅使用位掩码确定偏移量
Determine offset using only bitmask
你好,有问题
有一些遥测值封装在字(或双字)和每个遥测通道的位掩码中。
例如,我有掩码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
相关文章:
- 有没有办法将谓词中的元素偏移量传递给 std 算法?
- 位移操作和位掩码未检测到重复字符
- 通过指针偏移量访问结构变量值
- OpenCV - 带有掩码的absdiff
- 以线程安全的方式转换 C/C++ 中时区名称字符串的时区偏移量
- 生成前缀位掩码
- librdkafka:rd_kafka_assignment 返回分配分区的偏移量 -1001
- 是否通过向封闭对象的地址添加字节偏移量来访问子对象
- 向指针地址添加 20 个字节偏移量
- glMapBufferRange(..) 中的偏移量关系和 glDrawArraysInstanced(..) 中的第一
- 如何从__m64值的 lsb 创建 8 位掩码?
- 是否有与 C# Structs/StructLayout 等效的功能,C++中的字段偏移量?
- 我的 sumASCII 函数中的此偏移量是多少?
- boost::序列化中的派生类偏移量计算.有效吗?
- RedisGraph 语法错误在偏移量 8 靠近"创建"
- 胎面偏移量的时间复杂度?
- 如何对无符号长 int 进行位掩码?
- 如何从 c++ 中的给定标准输入中获取每个字符的偏移量?
- 删除K的背景掩码-意味着Python或C++中的集群/
- 仅使用位掩码确定偏移量