在一个字节中,如何将4个较高位与4个较低位进行交换

Ami*_*mir 5 c byte

我昨天接受了采访.

我被问到的一个问题是:如何用4个低位替换一个字节的4个高位.我们在这里谈论本地C,顺便说一句.

例如,考虑以下字节:AB输出应为:BA

好吧,那里的那个人告诉我它可以在一个命令中完成.我只是设法用3个命令做到了.

我问他答案,但他不情愿.

谢谢!

Omr*_*rel 10

uint8_t b = 0xab;

b = (b << 4) | (b >> 4);
Run Code Online (Sandbox Code Playgroud)

b 现在等于0xba.

这是你的意思吗?


Pau*_*kin 8

我想这可能是你的面试官正在寻找的答案:

unsigned char a = 0xab;
a *= 16.0625;
Run Code Online (Sandbox Code Playgroud)

它简短而漂亮,但在编译时效率不高.

  • +1哇!只需注意:`0.0625`是1/16 ...所以只需将数字乘以16(并忽略溢出),将数字除以16(忽略下溢)并对值求和! (3认同)

Joa*_*son 6

在x86上的gcc中,您可以使用ror单个内联汇编程序操作;

unsigned char a = 0x45;

asm("ror $4,%1" : "+r" (a));

printf("0x%x\n", a);
Run Code Online (Sandbox Code Playgroud)

输出0x54.

作为替代方案,正如OmriBarel在评论中所建议的那样,如果你可以做一些准备工作,那么查找也会起作用;

uint8_t* lookup = malloc(256);
unsigned int i;
for(i=0; i<256; i++) lookup[i]= i>>4 | i<<4;

uint8_t a = 0x54;
a = lookup[a];
printf("0x%x\n", a);
Run Code Online (Sandbox Code Playgroud)

输出0x45.