這是你所需要的:
int logical_right_shift(int x, int n)
{
int size = sizeof(int) * 8; // usually sizeof(int) is 4 bytes (32 bits)
return (x >> n) & ~(((0x1 << size) >> n) << 1);
}
解釋
x >> n
轉變n bits
權。但是,如果x
爲負,符號位(最左邊的位)將被複制到它的權利,例如:
假設每個int是32位這裏,讓
x = -2147483648 (10000000 00000000 00000000 00000000)
,然後
x >> 1 = -1073741824 (11000000 00000000 00000000 00000000)
x >> 2 = -536870912 (11100000 00000000 00000000 00000000)
等等。
因此,當n爲負時,我們需要清除那些符號額外符號位。
假設n = 5
這裏:
0x1 << size
移動1
到最左邊的位置:
(10000000 00000000 00000000 00000000)
((0x1 << size) >> n) << 1
複印1到其n-1
鄰居:
(11111000 00000000 00000000 00000000)
~((0x1 << size) >> n) << 1!
反轉所有位:
(00000111 11111111 11111111 11111111)
,所以我們最終得到的是面膜,以提取真正需要從x >> n
:
(x >> n) & ~(((0x1 << size) >> n) << 1)
的&
操作做的伎倆。
並且該功能的總成本是6
操作。
你正在做一個邏輯右移運營商簽署的類型? – 2011-03-09 22:43:32
if(n == 0){return x; ''? – 2011-03-09 22:45:36
使用@Mark的建議,你可以改變它爲此(不保證它的工作原理):'return(n == 0?x:(x >> n)&〜(((x >>(size << 3 ) - 1)<<(size << 3) -1)) >>(n-1));' – 2011-03-09 22:47:41