2014-03-28 90 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); 

一個聰明的編譯器可以很容易地優化這些進入最好的說明。