Delphi与C__内置clz()的等价物是什么?

Delphi与C__内置clz()的等价物是什么?,delphi,Delphi,引自 -内置函数:int\uu内置函数(未签名的int x) 返回x中前导0位的数目,从最高有效位位置开始。如果x为0,则结果未定义 Delphi与C__内置clz()的等价物是什么?如果没有,如何在Delphi中高效地实现它 实际上,我想用它来计算整数的以2为底的对数。如果您只关心32位代码,那么它是这样的: function __builtin_clz(x: Cardinal): Cardinal; asm BSR EAX,EAX NEG EAX ADD

引自

-内置函数:
int\uu内置函数(未签名的int x)
返回x中前导0位的数目,从最高有效位位置开始。如果x为0,则结果未定义

Delphi与C__内置clz()的等价物是什么?如果没有,如何在Delphi中高效地实现它


实际上,我想用它来计算整数的以2为底的对数。

如果您只关心32位代码,那么它是这样的:

function __builtin_clz(x: Cardinal): Cardinal;
asm
  BSR     EAX,EAX
  NEG     EAX
  ADD     EAX,32
end;
或者,如果您还想支持64位代码,那么它将是:

function __builtin_clz(x: Cardinal): Cardinal;
{$IF Defined(CPUX64)}
asm
  BSR     ECX,ECX
  NEG     ECX
  ADD     ECX,31
  MOV     EAX,ECX
{$ENDIF}
{$IF Defined(CPUX86)}
asm
  BSR     EAX,EAX
  NEG     EAX
  ADD     EAX,31
{$ENDIF}
end;
asm专家很可能会对此稍作调整,但关键指令是BSR(位扫描反转)


对于移动编译器,我不知道如何有效地执行此操作。

@David_Heffernan-这是一个非常快速的答案,感谢您提供了内置clz的32位和64位实现。对于其他平台,我将使用基于快速可移植算法的纯Pascal代码来实现它,该算法适用于散布在互联网上的
\uuuu builtin\uCLZ
。FWIW,我怀疑这里的实现在x为0时不同于GCC。当然,他们声明它是未定义的,但只是为了让你知道。当然,你知道如何处理零对数@Astaroth,有关其他处理器,请参见.Integer Log base 2:
函数IntLog2 Value:Integer:Integer;asm BSR EAX,EAX end。正如大卫提到的,你必须检查零。看见