2
好吧,所以我知道通常左右位移只能爲值0..31
定義好。我正在考慮如何最好地擴展它以包含32,這簡化了一些算法。我想出了:如何將32位整數移位32(再次)
int32 << n & (n-32) >> 5
這似乎工作。問題是,是否可以在任何體系結構(C,C++,Java)上工作,並且可以更有效地完成?
好吧,所以我知道通常左右位移只能爲值0..31
定義好。我正在考慮如何最好地擴展它以包含32,這簡化了一些算法。我想出了:如何將32位整數移位32(再次)
int32 << n & (n-32) >> 5
這似乎工作。問題是,是否可以在任何體系結構(C,C++,Java)上工作,並且可以更有效地完成?
在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。我看不出如何能夠進一步改進。
你有沒有考慮過移動32,然後轉移到其餘的地方? –
它實際上包含32個。只有32個以上沒有定義。 –
Java規範提到如果左手操作數是32位,它只使用右手操作數的低5位,並且我相信ANSI C也是如此。 – Turin