我在说这个:
如果我们有字母'A',十进制为77,十六进制为4D.我正在寻找获得D的最快方法.
我想到了两种方式:
给定x是一个字节.
x << 4; x >> 4
x %= 16
还有其他方法吗?哪一个更快?
简洁很好 - 解释更好:)
x &= 0x0f
当然,这是正确的答案.它完全表达了您想要实现的目标,并且在任何理智的架构上总是会编译为最小数量的指令(即1).只要将常量放在逐位运算符中,就要使用十六进制而不是十进制.
x <<= 4; x >>= 4
仅当你的'byte'是正确的无符号类型时才会起作用.如果它实际上是一个签名的字符,那么第二个操作可能会导致符号扩展(即你的原始位3也会出现在4-7位).
如果没有优化,这当然需要2条指令,但是在OSX上使用GCC,甚至
-O1
会将其减少到第一个答案.
x %= 16
即使没有启用优化器,您的编译器几乎肯定会在这里做正确的事情并将那个昂贵的div/mod操作转换为第一个答案.然而,它只能为两个权力做到这一点,而这种范式并没有使你想要实现的目标显而易见.
我总是用 x &= 0x0f
有很多好的答案,其中一些在技术上是正确的.
在更广泛的范围内,人们应该理解C/C++不是汇编程序.程序员的工作是尝试告诉编译器你想要实现的目标.编译器将根据体系结构和各种优化标志选择最佳方法.
x&= 0x0F; 是告诉编译器你想要实现什么的最清晰的方法.如果在某些架构上上下移动速度更快,那么编译器的工作就是了解它并做正确的事情.