在GNU C中获取/设置整数最高位的最便携方式是什么

Jos*_*son 8 c bitwise-operators

在GNU C中获取/设置整数最高位的最便携方法是什么?

这是彭博采访问题.那个时候我没有给出最好的答案.有人可以回答吗?

谢谢

R..*_*R.. 6

如果类型未签名,则很容易:

(type)-1-(type)-1/2
Run Code Online (Sandbox Code Playgroud)

对于签名值,我不知道.如果你找到了一种方法,它将回答关于SO的几个未解答的问题:

C问题:off_t(和其他有符号整数类型)的最小值和最大值

有没有办法在编译时计算整数类型的宽度?

也许其他人.

  • 另一种可能性是`〜((unsigned)-1 >> 1)` (4认同)
  • 有趣的是,对于空格ala`(类型)-1 - (类型)-1/2` ...: - /,答案是多么可读. (2认同)

bdo*_*lan 5

首先,请注意,如果我们谈论有符号整数,则没有可移植的方法来访问最高位; 标准中没有定义单个可移植表示,因此"顶部位"的含义原则上可以变化.另外,C不允许直接访问按位表示; 您可以将int作为char缓冲区访问,但您不知道"顶部位"的位置.

如果我们只关注有符号整数的非负范围,并假设所述范围的大小是2的幂(如果不是,那么我们需要再次关注有符号的表示):

#define INT_MAX_BIT (INT_MAX - (INT_MAX >> 1))
#define SET_MAX_BIT(x) (x | INT_MAX_BIT)
#define CLEAR_MAX_BIT(x) (x & ~INT_MAX_BIT)
Run Code Online (Sandbox Code Playgroud)

类似的方法可以与无符号整数一起使用,它可以用来获得真正的顶部位.