【发布时间】:2010-06-29 16:26:24
【问题描述】:
【问题讨论】:
-
您使用的是 8 位无符号字符吗?你一定不是,因为你得到 3051 作为你的答案。如评论中所述,代码仅适用于 8 位数据类型。
标签: c bit-manipulation
【问题讨论】:
标签: c bit-manipulation
十进制的3051 是二进制的101111101011。如果您像这样将它分成四位段:1011 1110 1011,您会看到最低四位在您想要的八位之上重复。原因是您没有屏蔽应该是前四位的值。
所以不要像这样:
(c >> 4) | ((c & 0x0f) << 4)
或类似的东西:
((c >> 4) | (c << 4)) & 0xff
你只需要这个:
(c >> 4) | (c << 4)
【讨论】:
您很可能确实有正确的数字,但您使用%d 打印它而不将其转换为 int(或其他有趣的方式)你显示它)。
我这么说是因为(3051 & 235) == 235,这不太可能是随机发生的巧合。
【讨论】:
int 不会有任何好处——3051 将适合int。为了做任何好事,您需要强制转换为unsigned char(这是可疑的 - 产生 3051 的代码显然需要修复,而不是捏造,至少 IMO)。
您只显示了 8 位,这意味着最大可能值为 28-1,即 255。
二进制中的 3051 是:1011 1110 1011,因此,您显然已经将最不重要的 nybble 复制到了第三个 nybble。
【讨论】: