我的头开始疼了......我一直这么看这个方式。
我试图屏蔽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-8
来0000 0000 0000 1111
。幸运的是,即使我们被告知我们假设右移是算术完成的,因为0xF
总是给我0000
的第一位。但这不是一个合适的解决方案。我们不允许测试字节序,然后从那里开始,所以我该怎么办?
答案 0 :(得分:3)
比特移位运算符在高于字节序的抽象级别上运行。 “左”移位总是向最高位移位,“右”移位总是向最低位移位。
答案 1 :(得分:2)
无论字节顺序如何,您都应该可以按(number of bits) - 4
右移。
由于您已经知道如何计算位数,因此只需减去4并按该数字移动就足够了,然后(为了安全起见),使用0xF
进行掩码。
有关字节序的讨论,请参阅this question。
答案 2 :(得分:0)
问但最重要的蚕食怎么样,2?
A (x >> (sizeof(int)*8-4)) & 0xF