假設一個語言的劃分運算符(/
)向-infinity
四捨五入。算術移位算子是否有用?
除了潛在的性能提升之外,在包括算術移位運算符(如>>
)的語言中是否還有任何用處,假設x >> y
將等於x/(2 ** y)
?
假設一個語言的劃分運算符(/
)向-infinity
四捨五入。算術移位算子是否有用?
除了潛在的性能提升之外,在包括算術移位運算符(如>>
)的語言中是否還有任何用處,假設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++將與我們在一起很長一段時間。
但我對你提出的選擇有疑問。在我看來,恰當的實現將是一個庫函數,它封裝了更高級別位移的可能用法,以便程序員不必向計算機解釋計算機實際上擅長的事情。
職能可以包括
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的'>>>')會更好。是否有任何情況*算術*轉換是最好的解決方案? – user200783
@PaulBaker:我傾向於認爲'>>>'更像是一種「無符號保留」的轉變,而不是「邏輯」與「算術」。如果你使用的是支持無符號類型的語言,並且你正在移動這些*,那麼就不需要任何區別。請注意,語言也可能支持將邏輯位集的移位操作符重載。 –