我昨天面试了。
我被问到的一个问题是:如何用它的 4 个低位替换一个字节的 4 个高位。顺便说一句,我们在这里谈论的是原生 C。
例如,考虑以下字节:AB 输出应为:BA
好吧,那里的人告诉我,这可以在一个命令中完成。我只设法在 3 个命令中做到这一点。
我问他答案,但他很不情愿。
谢谢!
uint8_t b = 0xab;
b = (b << 4) | (b >> 4);
b
现在等于 0xba。
这是你的意思吗?
我认为这可能是您的面试官正在寻找的答案:
unsigned char a = 0xab;
a *= 16.0625;
它简短而漂亮,但编译时不会太高效。
在 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
。
这个问题并没有真正有意义的措辞。什么是“一个命令”?什么是“命令”?
例如,可以通过使用转换表来做到这一点。b = table[b]
假设表已提前初始化,实际交换将如下所示。那是一个“命令”吗?除了运算符之外,赋值运算符是否算作单独的“命令” []
?
也许我只是在这里捕捉到一个技术性问题,但你给我们的指示不是交换两个半字节,而是用较低的一个替换较高的一个。在我看来,这会将 0xAB 转换为 0xBB,不一定是 0xBA。
b = (b << 4) | (b & 0xf);
这样做。如果你不担心低位会发生什么,那么我会
b <<= 4;