2014-03-28 47 views
0

假设一个语言的划分运算符(/)向-infinity四舍五入。算术移位算子是否有用?

除了潜在的性能提升之外,在包括算术移位运算符(如>>)的语言中是否还有任何用处,假设x >> y将等于x/(2 ** y)

回答

2

是的 - 清楚说明您对移位操作感兴趣是很有用的;你认为价值是“一系列比特”而不是数量级。

例如,如果我想代表四个字节的32位整数(和我没有这样做的一个简单的方法),我可能会使用:

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

这代表什么在我看来,我试图做得更好,而不是使用等效的分裂操作。

+0

对于你的例子,我同意算术转换比分割更好。但是,我认为*逻辑*转换(例如JavaScript的'>>>')会更好。是否有任何情况*算术*转换是最好的解决方案? – user200783

+1

@PaulBaker:我倾向于认为'>>>'更像是一种“无符号保留”的转变,而不是“逻辑”与“算术”。如果你使用的是支持无符号类型的语言,并且你正在移动这些*,那么就不需要任何区别。请注意,语言也可能支持将逻辑位集的移位操作符重载。 –

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); 

一个聪明的编译器可以很容易地优化这些进入最好的说明。