5

我昨天面试了。

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

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

好吧,那里的人告诉我,这可以在一个命令中完成。我只设法在 3 个命令中做到这一点。

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

谢谢!

4

5 回答 5

10
uint8_t b = 0xab;

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

b现在等于 0xba。

这是你的意思吗?

于 2013-05-22T19:58:32.393 回答
8

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

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

它简短而漂亮,但编译时不会太高效。

于 2013-05-24T14:10:40.397 回答
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

于 2013-05-22T20:18:42.617 回答
2

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

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

于 2013-05-22T20:16:37.017 回答
1

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

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

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

b <<= 4;
于 2013-05-22T20:14:08.773 回答