有什麼辦法來算術右移一個爲size_t值?
是的,有。事實上,給定的無符號類型的一個值v
,相信可以如下(例如用於size_t
)執行算術右移位:
v = (v >> 1U) | (v & ~(~(size_t) 0 >> 1U));
基本上,它執行邏輯右移,然後設置最顯著位爲1,如果移位前最顯著位是1
這裏有一個小玩具程序運行幾個測試:
#include <stdio.h>
void print_binary(size_t v) {
size_t mask = ~(~(size_t) 0 >> 1U);
while (mask) {
putchar('0'+!!(v&mask));
mask >>= 1U;
}
putchar('\n');
}
int main() {
size_t v;
// Some random number
v = 5583705;
print_binary(v);
v = (v >> 1U) | (v & ~(~(size_t) 0 >> 1U));
print_binary(v);
v = ~(~(size_t) 0 >> 1U);
print_binary(v);
int i;
for (i = 0; i < 10; i++) {
v = (v >> 1U) | (v & ~(~(size_t) 0 >> 1U));
print_binary(v);
}
return 0;
}
在我的機器,這個打印:
0000000000000000000000000000000000000000010101010011001101011001
0000000000000000000000000000000000000000001010101001100110101100
1000000000000000000000000000000000000000000000000000000000000000
1100000000000000000000000000000000000000000000000000000000000000
1110000000000000000000000000000000000000000000000000000000000000
1111000000000000000000000000000000000000000000000000000000000000
1111100000000000000000000000000000000000000000000000000000000000
1111110000000000000000000000000000000000000000000000000000000000
1111111000000000000000000000000000000000000000000000000000000000
1111111100000000000000000000000000000000000000000000000000000000
1111111110000000000000000000000000000000000000000000000000000000
1111111111000000000000000000000000000000000000000000000000000000
1111111111100000000000000000000000000000000000000000000000000000
似乎工作正常。
對於你的具體問題,我相信dlask的答案是最好的方法,但我決定發佈這個答案,因爲你表現出興趣知道如何(以及如果)在無符號類型上進行算術右移。
如果我理解正確,你想要的是有效'size_t mask = original? -1:0;',如果通過「從包含1或0的值創建掩碼」,則表示從1位到'size_t'具有的多個位的符號擴展。 –
是的,差不多。我的一部分想在沒有三元操作員的情況下完成。但我仍然很好奇,如果有一個好的方法來進行算術右移。 – skeggse
爲什麼downvote,任何人? – skeggse