Assembly O(1)时间内的二进制对数(在寄存器x86或SIMD上操作),无移位?

Assembly O(1)时间内的二进制对数(在寄存器x86或SIMD上操作),无移位?,assembly,x86,sse,mmx,binary-log,Assembly,X86,Sse,Mmx,Binary Log,我想看看是否有一种方法可以找到一个数的最大值。假设你有一个数字4,那么你通过增加2得到4的幂是2 我知道这在移位和计数中是可能的,但它使用O(N)操作。对于n中x=2^n的任何O(1),是否有某种方法可以获得O(1) 我想在这里找到n,在一次操作中知道x,或者O(1)正如您指定的x86,听起来您需要BSR(位扫描反转)操作码,它报告最高有效位的位置 [仅供参考:big-O表示法指的是渐近复杂性(即N->无穷大);如果N有一个有限限制(在本例中为32或64),则没有多大意义。]BSR是一条x86指

我想看看是否有一种方法可以找到一个数的最大值。假设你有一个数字4,那么你通过增加2得到4的幂是2

我知道这在移位和计数中是可能的,但它使用
O(N)
操作。对于
n
x=2^n
的任何
O(1)
,是否有某种方法可以获得
O(1)


我想在这里找到
n
,在一次操作中知道
x
,或者
O(1)

正如您指定的x86,听起来您需要
BSR
(位扫描反转)操作码,它报告最高有效位的位置


[仅供参考:big-O表示法指的是渐近复杂性(即N->无穷大);如果N有一个有限限制(在本例中为32或64),则没有多大意义。]

BSR
是一条x86指令。我得查一下,谢谢你的
FYI
。我很少使用这些东西,只是在我有创意的时候。根据你使用的编译器的不同,你很可能会使用一个内在的东西来帮助你编写asm-当然gcc和MSVC都有这样的内在的东西(尽管名字不同)。@Paul R我使用的是gcc,我在所有的内部函数中都找到了这个,但找不到任何类似于
BSR
的函数。如果您想到了什么,请告诉我。对于gcc,它是
\uuuu builtin\u clz
(其中
clz
表示计数前导零)。有关gcc和MSVC的更多详细信息,请参阅。@paurr good ref,“计数前导零”是在除x86之外的许多体系结构上实现这一点的原因。请参阅上的表格了解其他指令集。请参阅:是的,我找到了汇编程序部分,但只是在这个线程上找到了答案之后。我不知道BSR的存在。Thx用于注释。在SIMD中,您可以强制转换为浮点并提取指数。有关HW角度,请参阅