我对这两个指令有些困惑。首先,当扫描值为0且结果不确定/bsr或位大小/lzcnt时,让我们放弃特殊情况-这种区别很明显,不是我的问题的一部分。

让我们采用二进制值0001 1111 1111 1111 1111 1111 1111 1111
根据Intel的规范,lzcnt的结果为3

根据英特尔的规范,bsr的结果为28
lzcnt计数,bsr返回距位0(即lsb)的索引或距离。

如果CPU上没有可用的BMI,这两个指令如何相同,如何将lzcnt模拟为bsr?还是在bsr的情况下,位0是msb?英特尔规范中的两个“代码操作”也不同,一个在左边计数或索引,另一个在右边计数或索引。

也许有人可以对此有所了解,如果没有BMI/lzcnt指令,我没有CPU来测试回退到bsr的结果是否具有相同的结果(因为值0的特殊情况永远不会发生)。

最佳答案

LZCNT给出前导零位的数量。 BSR给出最高有效1位的位索引。因此,对于结果为非零的情况,它们将有效地执行相同的操作,只是对结果的解释不同。因此,您可以从31中减去BSR结果以获得与oj​​it_code相同的行为,即LZCNT

关于assembly - 关于bsr和lzcnt的困惑,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25683690/

10-11 15:11