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

时间:2013-05-22 19:55:01

标签: c byte

我昨天接受了采访。

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

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

嗯,那个人告诉我它可以在一个命令中完成。 我只是设法用3个命令来做。

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

谢谢!

5 个答案:

答案 0 :(得分:10)

uint8_t b = 0xab;

b = (b << 4) | (b >> 4);

b现在等于0xba。

这是你的意思吗?

答案 1 :(得分:8)

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

unsigned char a = 0xab;
a *= 16.0625;

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

答案 2 :(得分:6)

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

unsigned char a = 0x45;

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

printf("0x%x\n", a);

输出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);

输出0x45

答案 3 :(得分:2)

这个问题并没有真正有意义的措辞。什么是“一个命令”?什么是“命令”?

例如,可以通过使用转换表来实现。假设表已提前初始化,实际交换将看起来像b = table[b]。这是一个“命令”吗?除了[]运算符之外,赋值运算符是否还算作单独的“命令”?

答案 4 :(得分:1)

也许我只是在这里抓住技术性,但你给我们的指示不是交换两个半字节,而只是用较低的一个替换较高的一个。在我看来,将0xAB转换为0xBB,不一定是0xBA。

b = (b << 4) | (b & 0xf);

那样做。如果你不担心低位会发生什么,那么我就是

b <<= 4;