交换C中的数字位

10 c bit-manipulation

在C采访中,我被要求将最后4位的数字的前4位交换掉.(例如,1011 1110应为1110 1011.)

有人有解决方案吗?

ars*_*ars 15

如果你还没有看到或做过多少工作,一个很好的学习资源是:


Ken*_*nan 8

unsigned char c;

c = ((c & 0xf0) >> 4) | ((c & 0x0f) << 4);
Run Code Online (Sandbox Code Playgroud)


Rod*_*ddy 6

这种面试问题没有"正确答案".有几种方法可以做到这一点(查找表,任何人?),并且需要讨论每种方式之间的权衡(可读性与性能对可移植性与可维护性之间的权衡).

这个问题只是一个让你讨论上述问题的开场白,并确定你如何"深入"地讨论这些问题.


Joh*_*han 3

只需使用一个临时变量并将最后一位移动到该变量中,然后沿该方向移动该位并在 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 代码,我的猜测是它们或多或少是相同的,因为在“编译器优化”部分期间消除了开销。