首页 > 解决方案 > 按位 - 获取字节中第一位的位置

问题描述

我正在尝试考虑一种有效的算法,它可以返回一个位掩码,给出第一个位的位置,即“1”,从输入开始计数。

例如: 000 1 0101 应该给出 000 1 0000 和 1 1111111 应该给出1 0000000

我想最明显的方法是做一个循环来检查第一位并按位移动直到字符串结束,但我想尽可能避免循环。

任何认为他们对此有很好的解决方案的人,请随时发布!

标签: bit-manipulationbitwise-operators

解决方案


您正在寻找的函数/操作码有一个名称::TZCNT“计算尾随零位的数量”。如果您的 CPU 支持BMI1指令集扩展,则它可用。结合BTS:“位测试和设置”,您可以使用两个主要操作码来实现您的目标:

xor   eax, eax                ; Clears EAX and breaks dependencies
tzcnt edx, [memoryOperand]    ; Gets the count of trailing 0's in EDX
bts   eax, edx                ; Sets the bit found by TZCNT in EAX

此示例中的位空间来自0..31.


推荐阅读