我在说这个:
如果我们有字母'A',十进制为77,十六进制为4D。 我正在寻找获得D的最快方式。
我想到了两种方式:
鉴于x是一个字节。
x << 4; x >> 4
x %= 16
还有其他方法吗?哪一个更快?
答案 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