在C中读写整数的最高位时,最便携的方式是什么?
这是一个彭博社的面试问题。我当时没有给出最好的答案。有人能回答这个问题吗?
发布于 2011-01-26 11:51:09
如果类型是无符号的,则很容易:
(type)-1-(type)-1/2对于有符号的值,我知道不可能。如果你找到一种方法,它会回答几个未回答的问题,所以:
C question: off_t (and other signed integer types) minimum and maximum values
Is there any way to compute the width of an integer type at compile-time?
也许是其他人。
发布于 2011-01-26 11:42:30
首先,请注意,如果我们讨论的是有符号整数,则没有可移植的方法来访问顶部位;标准中根本没有定义单一的可移植表示,因此“顶部位”的含义在原则上可以变化。此外,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)一种类似的方法可以用于无符号整数,它可以用来获得真正的top bit。
发布于 2011-01-26 12:18:41
下面是一个愚蠢的例子,使用:
Built-in Function: int __builtin_clz (unsigned int x)
Returns the number of leading 0-bits in x, starting at the most
significant bit position. If x is 0, the result is undefined. 第一次尝试:
int get_msb(int x) { return x ? __buildin_clz(x) == 0 : 0; }注意:指定int或unsigned int参数的函数可以在没有警告的情况下与另一种类型一起调用,这是C的一个怪癖。但是,这可能涉及到转换- C++标准4.7.2规定:
如果目标类型是无符号类型,则结果值是与源整数相同的最小无符号整数(模2n,其中n是用于表示无符号类型的位数)。注意:在二进制补码表示中,这种转换是概念性的,位模式没有变化(如果没有截断)。
这意味着如果位模式不是二进制补码表示,那么位模式可能会改变,这也会停止这种“解决方案”的可靠工作。:-(
Chris下面的评论提供了一个解决方案(在这里作为一个函数而不是预处理器宏):
int get_msb(int x) { return x ? __buildin_clz(*(unsigned*)&x) == 0 : 0; }https://stackoverflow.com/questions/4801207
复制相似问题