【问题标题】:What is the Delphi equivalent to the C __builtin_clz()?什么是 Delphi 等价于 C __builtin_clz()?
【发布时间】:2015-06-24 20:20:30
【问题描述】:

引自https://gcc.gnu.org/onlinedocs/gcc/Other-Builtins.html

——内置函数:int __builtin_clz (unsigned int x) 返回 x 中前导 0 位的数量,从最高有效位位置开始。如果 x 为 0,则结​​果未定义。

什么是 Delphi 等价于 C __builtin_clz() ?如果没有,如何在 Delphi 中高效实现?

其实我想用它来计算一个整数的以2为底的对数。

【问题讨论】:

标签: delphi


【解决方案1】:

如果你只关心 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 - 答案如此之快,感谢您提供 __builtin_clz 的 32 位和 64 位实现。对于其他平台,我将使用基于散布在互联网上的__builtin_clz 的快速可移植算法的纯Pascal 代码来实现。
  • FWIW,我怀疑这里的实现在 x 为 0 时与 GCC 不同。当然,他们声明它是未定义的,但只是为了让您知道。当然,你知道如何处理零日志!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-30
相关资源
最近更新 更多