C 无论int位长度和endianness如何,获取最大有效半字节

C 无论int位长度和endianness如何,获取最大有效半字节,c,bit-manipulation,endianness,C,Bit Manipulation,Endianness,我的头开始痛了。。。我这样看太久了 我试图屏蔽一个int的最重要的半字节,而不考虑int位的长度和机器的尾数。假设x=8425=0010 0000 1110 1001=0x20E9。我知道要获得最低有效位,9,我只需要做一些类似于x&0xF的事情来返回9。但是最重要的一个半字节,2 我很抱歉,如果我的逻辑从此崩溃,我的大脑完全崩溃了,但我要说: 我的书告诉我,数据类型int的位长度w可以通过w=sizeof(int)位移位运算符在endianness之上的抽象级别上进行计算。“左”移位总是向最高

我的头开始痛了。。。我这样看太久了

我试图屏蔽一个int的最重要的半字节,而不考虑int位的长度和机器的尾数。假设
x=8425
=
0010 0000 1110 1001
=
0x20E9
。我知道要获得最低有效位,
9
,我只需要做一些类似于
x&0xF
的事情来返回
9
。但是最重要的一个半字节,
2

我很抱歉,如果我的逻辑从此崩溃,我的大脑完全崩溃了,但我要说:


我的书告诉我,数据类型int的位长度w可以通过
w=sizeof(int)位移位运算符在endianness之上的抽象级别上进行计算。“左”移位总是向最高有效位移位,“右”移位总是向最低有效位移位。

您应该能够通过
(位数)-4进行右移位,而不考虑尾数。
由于您已经知道如何计算位数,只需减去4并按该位数移位就足够了,然后(为了安全起见)使用
0xF
屏蔽


有关endianness的讨论,请参见。

Q,但最重要的一点是什么,2


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

噢,哇。也许他们应该称之为大移位和小移位,以节省我几年的时间:(这个解决方案只适用于
8位
整数,因为要移位的位数取决于整数的位长。“我的书告诉我,数据类型int的位长w可以用w=sizeof(int)来计算。”你的问题不够具体。 0x20E9最重要的小写只有<代码> 2 <代码>,如果你在一个有16位<代码> INT/C>的系统上,否则它将是<代码> 0 <代码>。此外,你认为最重要的负整数是什么?请澄清。