有没有人知道类似于De Bruijn的LSB的算法,但是对于MSB?或者更确切地说是确定MSB的最有效方法?
我知道Log_2(Val)会这样做,但我不知道它是否是最有效的方法。
我需要它的原因是我需要将little-endian转换为big-endian。我知道这个的标准算法。但是,输入为64位,但通常数字为16位或24位,因此在99.9%的时间内不需要交换整个8字节。
答案 0 :(得分:1)
答案 1 :(得分:1)
如果您想要一种快速方法并且能够/愿意使用硬件特定指令,您应该查看x86 BSR (位扫描反转)或类似指令。
在源操作数(第二个操作数)中搜索最高有效位设置位(1位)。如果最重要的1位是 发现,它的位索引存储在目标操作数(第一个操作数)中。
xor edx, edx
mov eax, 0x12345678
bsr edx, eax
它应该在edx中存储28(第28位是MSB)。如果没有找到MSB,edx将保持不变。