2016-01-31 88 views
2

好吧,所以我知道通常左右位移只能爲值0..31定義好。我正在考慮如何最好地擴展它以包含32,這簡化了一些算法。我想出了:如何將32位整數移位32(再次)

int32 << n & (n-32) >> 5 

這似乎工作。問題是,是否可以在任何體系結構(C,C++,Java)上工作,並且可以更有效地完成?

+0

你有沒有考慮過移動32,然後轉移到其餘的地方? –

+0

它實際上包含32個。只有32個以上沒有定義。 –

+0

Java規範提到如果左手操作數是32位,它只使用右手操作數的低5位,並且我相信ANSI C也是如此。 – Turin

回答

2

在Java中,如果這些變量的類型爲int,則可以保證工作。但要小心運營商的優先級。

int lshift(int x, int n) 
{ 
    return (x << n) & ((n-32) >> 5); 
} 

這將用於換檔工作計數到32.但是,它可以被修改,以包括任何INT值隨着移位計數大於31返回0

return (x << n) & ((n-32) >> 31); 
在C和C++的 >>操作者

然而是實現定義的。大多數(如果不是全部現代)實現實現它作爲算術轉換,所以它將工作,如果類型是int32_t或等效。但不能保證。在使用邏輯移位>>的架構上,您需要自己實現算術移位。

如果架構支持像x86或ARM條件指令,然後通過以下方式可以更快

return n < 32 ? x << n : 0; 

你可以看到輸出組件here。我看不出如何能夠進一步改進。