我对这两个指令有些困惑。首先,当扫描值为0且结果不确定/bsr或位大小/lzcnt时,让我们放弃特殊情况-这种区别很明显,不是我的问题的一部分。
让我们采用二进制值0001 1111 1111 1111 1111 1111 1111 1111
根据Intel的规范,lzcnt
的结果为3
根据英特尔的规范,bsr
的结果为28lzcnt
计数,bsr
返回距位0(即lsb)的索引或距离。
如果CPU上没有可用的BMI,这两个指令如何相同,如何将lzcnt
模拟为bsr
?还是在bsr
的情况下,位0是msb?英特尔规范中的两个“代码操作”也不同,一个在左边计数或索引,另一个在右边计数或索引。
也许有人可以对此有所了解,如果没有BMI/lzcnt
指令,我没有CPU来测试回退到bsr
的结果是否具有相同的结果(因为值0的特殊情况永远不会发生)。
最佳答案
LZCNT
给出前导零位的数量。 BSR
给出最高有效1位的位索引。因此,对于结果为非零的情况,它们将有效地执行相同的操作,只是对结果的解释不同。因此,您可以从31中减去BSR
结果以获得与ojit_code相同的行为,即LZCNT
。
关于assembly - 关于bsr和lzcnt的困惑,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25683690/