首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在C中读写整数的最高位时,最便携的方式是什么?

在C中读写整数的最高位时,最便携的方式是什么?
EN

Stack Overflow用户
提问于 2011-01-26 11:36:24
回答 5查看 2.4K关注 0票数 8

在C中读写整数的最高位时,最便携的方式是什么?

这是一个彭博社的面试问题。我当时没有给出最好的答案。有人能回答这个问题吗?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-01-26 11:51:09

如果类型是无符号的,则很容易:

代码语言:javascript
复制
(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?

也许是其他人。

票数 6
EN

Stack Overflow用户

发布于 2011-01-26 11:42:30

首先,请注意,如果我们讨论的是有符号整数,则没有可移植的方法来访问顶部位;标准中根本没有定义单一的可移植表示,因此“顶部位”的含义在原则上可以变化。此外,C不允许直接访问按位表示;您可以将int作为char缓冲区访问,但您不知道“顶部位”位于何处。

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

代码语言:javascript
复制
#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。

票数 5
EN

Stack Overflow用户

发布于 2011-01-26 12:18:41

下面是一个愚蠢的例子,使用:

代码语言:javascript
复制
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. 

第一次尝试:

代码语言:javascript
复制
int get_msb(int x) { return x ? __buildin_clz(x) == 0 : 0; }

注意:指定intunsigned int参数的函数可以在没有警告的情况下与另一种类型一起调用,这是C的一个怪癖。但是,这可能涉及到转换- C++标准4.7.2规定:

如果目标类型是无符号类型,则结果值是与源整数相同的最小无符号整数(模2n,其中n是用于表示无符号类型的位数)。注意:在二进制补码表示中,这种转换是概念性的,位模式没有变化(如果没有截断)。

这意味着如果位模式不是二进制补码表示,那么位模式可能会改变,这也会停止这种“解决方案”的可靠工作。:-(

Chris下面的评论提供了一个解决方案(在这里作为一个函数而不是预处理器宏):

代码语言:javascript
复制
int get_msb(int x) { return x ? __buildin_clz(*(unsigned*)&x) == 0 : 0; }
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4801207

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档