【发布时间】:2014-05-18 09:38:42
【问题描述】:
我的头开始疼了……我看这个方法太久了。
我试图掩盖 int 的最重要半字节,而不管 int 位长度和机器的字节序。假设x = 8425 = 0010 0000 1110 1001 = 0x20E9。我知道要获得最不重要的半字节,9,我只需要执行x & 0xF 之类的操作即可返回9。但是最重要的半字节2 怎么样?
如果我从现在开始的逻辑崩溃了,我很抱歉,我的大脑完全被烧毁了,但我走了:
我的书告诉我,数据类型 int 的位长 w 可以用w = sizeof(int)<<3 计算。如果我知道这台机器是大端的,我可以使用0xF << w-4 将1111 用于最重要的半字节,将0000 用于其余部分,即1111 0000 0000 0000。如果我知道这台机器是 little-endian,我可以通过 0xF >> w-8 得到 0000 0000 0000 1111。幸运的是,即使我们被告知假设右移是在算术上完成的,这仍然有效,因为0xF 总是给我0000 的第一位。但这不是一个适当的解决方案。我们不允许测试字节顺序然后从那里继续,那我该怎么办?
【问题讨论】:
-
"我的书告诉我,数据类型 int 的位长 w 可以用 w = sizeof(int)
-
您的问题不够具体。如果您使用的是 16 位
int的系统,0x20E9的最重要半字节仅是2。否则它将是0。另外,您认为负整数的最重要半字节是什么?请澄清。
标签: c bit-manipulation endianness