Programming languages 算术移位运算符有用吗?

Programming languages 算术移位运算符有用吗?,programming-languages,operators,language-design,Programming Languages,Operators,Language Design,假设一种语言的除法运算符(/)朝着-无穷大旋转 除了可能提高的性能外,该语言中是否还使用了算术移位运算符(>),因为x>>y将等同于x/(2**y)?是-明确表示您对位移位运算感兴趣很有用;你认为一个值是“一个位序列”,而不是一个量级 例如,如果我试图用四个字节表示一个32位整数(我没有更简单的方法),我可能会使用: bytes[0] = value & 0xff; bytes[1] = (value >> 8) & 0xff; bytes[2] = (value &

假设一种语言的除法运算符(
/
)朝着
-无穷大
旋转


除了可能提高的性能外,该语言中是否还使用了算术移位运算符(
>
),因为
x>>y
将等同于
x/(2**y)

是-明确表示您对位移位运算感兴趣很有用;你认为一个值是“一个位序列”,而不是一个量级

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

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

在我看来,这比使用等价的除法运算更容易理解。

不,不是真的。这是旧C世界的遗留问题,在旧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);

智能编译器可以很容易地将它们优化为最佳可用指令。

以您为例,我同意算术移位比除法更好。然而,我认为逻辑转换(例如JavaScript的
>
)会更好。有没有哪种情况下算术移位是最好的解决方案?@PaulBaker:我倾向于认为
>
更像是一种“不保留符号”的移位,而不是“逻辑”与“算术”。如果您使用的是一种支持无符号类型的语言,并且您正在迁移这些类型,那么就没有必要进行任何区分。请注意,语言也可能支持重载逻辑位集的移位运算符。