Допустимо ли выполнять побитовый сдвиг на отрицательную величину?Например, если у меня есть следующий код:
#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;
}
Это то, что я мог бы ожидать работать на всех архитектурах (в частности, что результат выражения x << shift_amt
, где shift_amount < 0
true, эквивалентенна 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');
}
}