c# - 在 C# 中计算整数 log2 的最快方法是什么?

标签 c# algorithm math bit-manipulation

如何最有效地计算 C# 中整数(对数基数 2)所需的位数?例如:

int bits = 1 + log2(100);

=> bits == 7

最佳答案

轻微 对 Guffa 答案的改进...由于您添加到结果中的数量始终是 2 的幂,因此使用位操作可以在某些体系结构上产生轻微的改进。此外,由于我们的上下文是位模式,因此使用十六进制更易读。在这种情况下,将算术移动 2 的幂是有用的。

int bits = 0;

if (n > 0xffff) {
  n >>= 16;
  bits = 0x10;
}

if (n > 0xff) {
  n >>= 8;
  bits |= 0x8;
}

if (n > 0xf) {
  n >>= 4;
  bits |= 0x4;
}

if (n > 0x3) {
  n >>= 2;
  bits |= 0x2;
}

if (n > 0x1) {
  bits |= 0x1;
}

还应添加对 n==0 的检查,因为以上将产生 0 的结果并且 Log(0) 未定义(无论基数如何)。

在 ARM 汇编中,该算法生成非常紧凑的代码,因为可以使用条件指令消除比较后的分支,从而避免流水线刷新。例如:

if (n > 0xff) {
   n >>= 8;
   bits |= 0x8;
}

变成(令 R0 = n,R1 = 位)

CMP R0, $0xff
MOVHI R0, R0, LSR $8
ORRHI R1, R1, $0x8

关于c# - 在 C# 中计算整数 log2 的最快方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8970101/

相关文章:

math - Haskell 数学类型系统的乐趣

javascript - 为什么这个简单的椭圆旋转会旋转太多并扭曲尺寸?

c# - 如何在 Windows Phone 8.1 上禁用 native 镜像生成?

c# - 防止几乎相同接口(interface)的代码重复

c# - Elasticsearch 地理位置未使用NEST映射到geo_point类型

algorithm - 从两组中选择具有相同权重的项目

c - 实现 Cannon 的算法

algorithm - 在程序中寻找循环不变式来计算立方和?

c# - 第一次引发 Elapsed 事件时进行测试。有效还是无用?

algorithm - S(n) Big Oh 的简单函数