按负数位移位是否有效?例如,如果我有以下代码:
#include <stdint.h>
uint32_t reverse_bits (uint32_t n)
{
uint32_t result = 0;
for (int i = 0; i < 32; i++)
{
uint32_t bit = n & (1 << i);
bit <<= 31 - i * 2;
result |= bit;
}
return result;
}
这是我可以期望在所有架构上工作的东西吗(特别是,当
shift_amount < 0
为真时,表达式x << shift_amt
的结果等同于x >> -shift_amt
)?注意:这不是关于在负数上执行位移的行为的问题(即
-1 << 1
)。以下是完整的测试程序:
#include <stdint.h>
#include <stdlib.h>
#include <stdio.h>
uint32_t reverse_bits (uint32_t n)
{
uint32_t result = 0;
for (int i = 0; i < 32; i++)
{
uint32_t bit = n & (1 << i);
bit <<= 31 - i * 2;
result |= bit;
}
return result;
}
void print_bits (uint32_t n)
{
for (int i = 0; i < 32; i++)
putchar(n & (1 << i) ? '1' : '0');
putchar('\n');
}
int main ()
{
for (int i = 0; i < 5; i++)
{
uint32_t x = rand();
x |= rand() << 16;
print_bits(x);
print_bits(reverse_bits(x));
putchar('\n');
}
}
warning: left shift count is negative [-Wshift-count-negative]
(当我使用<<= -1直接输入负数时)。 - Michael Dorganif(shift < 0) x>>=-shift;
,让gcc决定是否可以利用一些特定于架构的技巧来避免检查即可。顺便说一句,可能有更好的位反转算法。 - vgru