有什么办法来算术右移一个为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