无论int位长度和字节顺序如何,都可以获得最重要的半字节

时间:2014-04-06 05:53:56

标签: c bit-manipulation endianness

我的头开始疼了......我一直这么看这个方式。

我试图屏蔽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。如果我知道机器是小端的,我可以0xF >> w-80000 0000 0000 1111。幸运的是,即使我们被告知我们假设右移是算术完成的,因为0xF总是给我0000的第一位。但这不是一个合适的解决方案。我们不允许测试字节序,然后从那里开始,所以我该怎么办?

3 个答案:

答案 0 :(得分:3)

比特移位运算符在高于字节序的抽象级别上运行。 “左”移位总是向最高位移位,“右”移位总是向最低位移位。

答案 1 :(得分:2)

无论字节顺序如何,您都应该可以按(number of bits) - 4右移。 由于您已经知道如何计算位数,因此只需减去4并按该数字移动就足够了,然后(为了安全起见),使用0xF进行掩码。

有关字节序的讨论,请参阅this question

答案 2 :(得分:0)

但最重要的蚕食怎么样,2?

A (x >> (sizeof(int)*8-4)) & 0xF