有关交换位的问题

时间:2010-06-29 16:26:25

标签: c bit-manipulation

我对这个话题有疑问我觉得答案看起来不正确

Swap bits in a number in C

1110 1011它等于235但我得到3051为什么?

3 个答案:

答案 0 :(得分:2)

十进制中的值3051是二进制的101111101011。如果将它分成如下四位segmens:1011 1110 1011,您会看到最低的四位在您想要的八位之上重复。原因是你没有掩盖应该是前四位的值。

所以不要这样:

(c >> 4) | ((c & 0x0f) << 4)

或类似的东西:

((c >> 4) | (c << 4)) & 0xff

你只需要这个:

(c >> 4) | (c << 4)

答案 1 :(得分:1)

你很可能拥有正确的数字,但是你使用%d打印它而不用转换为int(或者其他有趣的东西)你展示它的方式)。

我之所以这样说是因为(3051 & 235) == 235,这不太可能是随机发生的巧合。

答案 2 :(得分:0)

您只显示了8位,这意味着最大可能值为2 8 -1,结果为255。

二进制中的3051是:1011 1110 1011,所以为了得到这个,你显然已经将最不重要的nybble复制到了第三个nybble中。