По 6 точкам совпадает с лобовым вариантом.
/* Разворот бит в слове */
unsigned short rvsbt(unsigned short v)
{
unsigned short r = v; // r will be reversed bits of v; first get LSB of v
int s = sizeof(v)*8 - 1; // extra shift needed at end
while(v > 1)
{
v >>= 1;
r <<= 1;
r |= v & 1;
s--;
}
return(r << s); // shift when v's highest bits are zero
}
/*
unsigned short rvsbt(unsigned short src)
{
unsigned short dst = 0;
#define N (sizeof(src)*8 - 1)
for(int i = 0; i <= N; i++)
{
if(src & (1 << i))
dst |= 1 << (N - i);
}
return dst;
}
*/
void main(void)
{
int val;
val = 0x00FF; printf("rvsbt(0x%04X) -> 0x%04X\n", val, rvsbt(val));
val = 0xFF00; printf("rvsbt(0x%04X) -> 0x%04X\n", val, rvsbt(val));
val = 0x5A5A; printf("rvsbt(0x%04X) -> 0x%04X\n", val, rvsbt(val));
val = 0xAAAA; printf("rvsbt(0x%04X) -> 0x%04X\n", val, rvsbt(val));
val = 0x5AAA; printf("rvsbt(0x%04X) -> 0x%04X\n", val, rvsbt(val));
val = 0xAA5A; printf("rvsbt(0x%04X) -> 0x%04X\n", val, rvsbt(val));
}
Снимок экрана сравнивающий бинарный код вашего (слева) и лобового варианта, собирал Tiny C (win32) - tcc main.c:
-
- Спасибо! - De_User(14.07.2018 18:00)