【发布时间】:2019-02-13 21:20:12
【问题描述】:
执行负数移位是否有效? 例如,如果我有以下代码:
#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');
}
}
【问题讨论】:
-
您假设 an
unsigned long是 32 位宽。 -
是的,我将编辑示例代码以明确暗示 32 位(或更宽)无符号整数类型
-
很好奇 - 你的编译器上的警告是什么意思?
warning: left shift count is negative [-Wshift-count-negative](当我直接使用 -
诚然我还没有测试过这个,也许我现在应该这样做。