Assembly 是否有x86(_64)指令提供最高(或最低)集合(1)位的索引?

Assembly 是否有x86(_64)指令提供最高(或最低)集合(1)位的索引?,assembly,x86,bit-manipulation,Assembly,X86,Bit Manipulation,如前所述。e、 g.对于8位(例如,不考虑字节顺序)整数00100(基数2),是否有给出5的指令?是。但是,请注意,该页面声称至少在一个CPU上,位移位操作序列(展开循环)比单个BSR更快。从技术上讲,不是。要找到设置的最高有效位,并找到设置的最低有效位,但最小的项都是16位字使用C或C++的可能副本,请参见(详细内容请参见我的回答)我对bithacks页面上的评论感到困惑。BSR本身不计算二的次高幂。您必须使用64-BSR(v-1),这显然不是“单一的BSR汇编语言指令”。也许我只是误读了,不

如前所述。e、 g.对于8位(例如,不考虑字节顺序)整数00100(基数2),是否有给出5的指令?

是。但是,请注意,该页面声称至少在一个CPU上,位移位操作序列(展开循环)比单个BSR更快。

从技术上讲,不是。要找到设置的最高有效位,并找到设置的最低有效位,但最小的项都是16位字

使用C或C++的可能副本,请参见(详细内容请参见我的回答)我对bithacks页面上的评论感到困惑。BSR本身不计算二的次高幂。您必须使用
64-BSR(v-1)
,这显然不是“单一的BSR汇编语言指令”。也许我只是误读了,不是更快。来自bithack页面:“在Athlon上™ XP 2100+我发现上面的左移和OR代码的速度与使用单一BSR汇编语言指令的速度一样快“一些旧的AMD CPU的微代码速度很慢
BSR
/
bsf
(在发布此答案10年后完全过时)。在现代AMD上,它们的延迟约为7个uop,3个周期(),而在英特尔上则为1个uop/3c。(除了对输出的“假”依赖外,它的古怪行为是在src=0时保持目标不变,由AMD记录,但由AMD和Intel实现。)(
lzcnt
/
tzcnt
是所有支持它们的CPU上的单uop。)另请参见:一般性能和怪癖。关于字节,只要确保它是零扩展到一个更宽的寄存器(就像你通常做的那样)。由于BSR和BSF都查找位索引,因此额外的前导零并不重要。(或者对于AMD上速度更快的LZCNT,使用31 LZCNT,例如
LZCNT eax,eax
/
xor eax,31
,使用GCC在
bsr
方面实现
内置clz
的相同技巧)