获取字节中4个最低有效位(C ++)的最快方法是什么?

时间:2008-11-17 10:39:24

标签: c++ optimization operators bit-shift modulo

我在说这个:

如果我们有字母'A',十进制为77,十六进制为4D。 我正在寻找获得D的最快方式。

我想到了两种方式:

鉴于x是一个字节。

  1. x << 4; x >> 4

  2. x %= 16

  3. 还有其他方法吗?哪一个更快?

6 个答案:

答案 0 :(得分:37)

简洁很好 - 解释更好:)

  • x &= 0x0f
  

当然是正确的答案。它完全表达了您想要实现的目标,并且在任何理智的体系结构上总是会编译为最小数量的指令(即1)。每当将常量放入逐位运算符时,都要使用十六进制而不是十进制。

  • x <<= 4; x >>= 4
  

仅在您的'byte'是正确的无符号类型时才有效。如果它实际上是一个签名的字符,那么第二个操作可能会导致符号扩展(即你的原始位3也会出现在4-7位)。

     

没有优化,这当然需要2条指令,但是在OSX上使用GCC,即使是-O1也会将其减少到第一个答案。

  • x %= 16
  

即使没有启用优化器,您的编译器几乎肯定会在这里做正确的事情并将那个昂贵的div / mod操作转换为第一个答案。然而,它只能为两个权力做到这一点,而这种范式并没有使你想要实现的目标非常明显。

答案 1 :(得分:22)

我总是使用x &= 0x0f

答案 2 :(得分:10)

有许多好的答案,其中一些在技术上是正确的答案。

在更广泛的范围内,人们应该理解C / C ++不是汇编程序。程序员的工作是尝试告诉编译器你想要实现的目标。编译器将根据体系结构和各种优化标志选择最佳方法。

x&amp; = 0x0F;是告诉编译器你想要实现什么的最清晰的方法。如果在某些架构上上下移动速度更快,那么编译器的工作就是了解它并做正确的事情。

答案 3 :(得分:4)

单个AND操作就可以做到。

x = (x & 0x0F);

答案 4 :(得分:2)

在某种程度上取决于架构 - 在ARM上向上和向下移动可能是最快的方式 - 但是编译器应该为您做到这一点。事实上,编译器可能会对所有建议的方法进行相同的代码优化。

答案 5 :(得分:0)

x = x&amp; 15