unsigned char c;
c = ((c & 0xf0) >> 4) | ((c & 0x0f) << 4);
Run Code Online (Sandbox Code Playgroud)
这种面试问题没有"正确答案".有几种方法可以做到这一点(查找表,任何人?),并且需要讨论每种方式之间的权衡(可读性与性能对可移植性与可维护性之间的权衡).
这个问题只是一个让你讨论上述问题的开场白,并确定你如何"深入"地讨论这些问题.
只需使用一个临时变量并将最后一位移动到该变量中,然后沿该方向移动该位并在 tmp var 中的位中结束屏蔽即可完成。
更新: 让我们添加一些代码,然后您可以选择更具可读性的代码。
工作一班轮
unsigned int data = 0x7654;
data = (data ^ data & 0xff) | ((data & 0xf) << 4) | ((data & 0xf0) >> 4);
printf("data %x \n", data);
Run Code Online (Sandbox Code Playgroud)
相同的代码,但有一些临时变量
unsigned int data = 0x7654;
unsigned int tmp1 = 0;
unsigned int tmp2 = 0;
tmp1 = (0x0f&data)<<4;
tmp2 = (0xf0&data)>>4;
tmp1 = tmp1 | tmp2;
data = data ^ (data & 0xff);
data = data | tmp1;
printf("data %x \n", data);
Run Code Online (Sandbox Code Playgroud)
好吧,无论如何,单内衬较短:)
更新:
如果您查看 gcc 使用 -Os -S 生成的 asm 代码,我的猜测是它们或多或少是相同的,因为在“编译器优化”部分期间消除了开销。
| 归档时间: |
|
| 查看次数: |
49933 次 |
| 最近记录: |