按位**乘以负数以反转数字中的位

rse*_*thc 4 c shift

以负数执行按位移位是否有效?例如,如果我有以下代码:

#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;
}
Run Code Online (Sandbox Code Playgroud)

这是不是我可以期望在所有体系下工作(具体而言,表达式的结果x << shift_amt,其中shift_amount < 0是真实的,就相当于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');
    }
}
Run Code Online (Sandbox Code Playgroud)

Gov*_*mar 8

C标准声明,在第6.5.7段第3段中,按负数移位是明确未定义的行为:

如果右操作数的值为负或大于或等于提升的左操作数的宽度,则行为未定义.

强调我的.