算术移位算子有用吗?

时间:2014-03-28 14:19:52

标签: programming-languages operators language-design

假设语言的除法运算符(/)向-infinity舍入。

除了可能提高的性能之外,在语言中是否有任何用途,包括算术移位运算符(>>,比如说),假设x >> y等同于x / (2 ** y)

2 个答案:

答案 0 :(得分:2)

是的 - 明确表示您对比特转换操作感兴趣是有用的;你正在考虑一个值作为"一系列的比特"而不是一个数量级。

例如,如果我试图以四个字节表示一个32位整数(并且我没有更简单的方法)我可能会使用:

bytes[0] = value & 0xff;
bytes[1] = (value >> 8) & 0xff;
bytes[2] = (value >> 16) & 0xff;
bytes[3] = (value >> 24) & 0xff;

在我看来,这代表了我尝试做的更多,而不是使用等效的分工操作。

答案 1 :(得分:0)

不,不是真的。这是旧C世界的遗产,可以依赖这些运算符发出特定指令。它们意味着低水平控制,这根本不应该是需要或预期的。不幸的是,在许多情况下它仍然存在,并且C / C ++将在很长一段时间内与我们合作。

但我对你提议的替代方案提出异议。在我看来,正确的实现是一个库函数,它封装了更高级别的位移的可能用途,因此程序员没有义务向计算机解释如何做计算机实际上相当擅长的事情。

可能的功能可能包括

int Shift(int value, int distance);
unsigned int Shift(unsigned int value, int distance);
unsigned int Rotate(unsigned int value, int distance);
double DivideByPower(double value, double base, double power);

智能编译器可以轻松地将这些优化为最佳可用指令。