首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在C++中获取整数的位长?

如何在C++中获取整数的位长?
EN

Stack Overflow用户
提问于 2015-04-01 10:41:46
回答 5查看 14K关注 0票数 10

这个问题不是Count the number of set bits in a 32-bit integer的翻版。见下文丹尼尔S.的评论。

--

假设有一个变量int x;。其大小为4字节,即32位。

然后我给这个变量赋值x = 4567 (在二进制10001 11010111中),所以在内存中如下所示:

00000000 00000000 00010001 11010111

有没有办法得到重要的比特的长度。在我的例子中,位的长度是13 (我用粗体标记它们)。如果我使用sizeof(x),它返回4,即4个字节,这是整个int的大小。如何获得表示整数所需的最小位数,而不使用前导0s?

EN

回答 5

Stack Overflow用户

发布于 2015-04-01 11:21:36

代码语言:javascript
复制
unsigned bits, var = (x < 0) ? -x : x;
for(bits = 0; var != 0; ++bits) var >>= 1;

这应该是为了你。

票数 8
EN

Stack Overflow用户

发布于 2015-04-01 10:57:26

警告:前面有数学。如果你很敏感,跳到TL,博士。

您真正要寻找的是设置的最高位。让我们写出二进制数10001 11010111的实际含义:

代码语言:javascript
复制
x = 1 * 2^(12) + 0 * 2^(11) + 0 * 2^(10) + ... + 1 * 2^1 + 1 * 2^0

其中*表示乘法,^表示指数。

你可以把这个写成

代码语言:javascript
复制
2^12 * (1 + a)

其中0 < a < 1 (准确地说,是a = 0/2 + 0/2^2 + ... + 1/2^11 + 1/2^12)。

如果你取对数(基数2),让我们用log2表示它,你得到的这个数字

代码语言:javascript
复制
log2(2^12 * (1 + a)) = log2(2^12) + log2(1 + a) = 12 + b.

a < 1以来,我们可以得出这样的结论:1 + a < 2,因此是b < 1

换句话说,如果你把log2(x)取下来,你会得到最重要的2的力量(在这个例子中,12)。由于功率从0开始计算,比特数比这个幂多一个,即13。所以:

TL;博士

表示x数所需的最小位数由

代码语言:javascript
复制
numberOfBits = floor(log2(x)) + 1
票数 6
EN

Stack Overflow用户

发布于 2015-04-01 14:15:28

你在寻找这个数字中最重要的部分。让我们暂时忽略负数。我们怎么能找到它?那么,让我们看看,在整数为零之前,我们需要将多少位位设置为零。

代码语言:javascript
复制
00000000 00000000 00010001 11010111
00000000 00000000 00010001 11010110
                                  ^
00000000 00000000 00010001 11010100
                                 ^
00000000 00000000 00010001 11010000
                                ^
00000000 00000000 00010001 11010000
                               ^
00000000 00000000 00010001 11000000
                              ^
00000000 00000000 00010001 11000000
                             ^
00000000 00000000 00010001 10000000
                            ^
...
                       ^
00000000 00000000 00010000 00000000
                      ^
00000000 00000000 00000000 00000000
                     ^

完成了!13分钟后,我们把它们全部清除了。现在我们该怎么做?表达式1<< pospos位置上的1位移位。因此,我们可以检查if (x & (1<<pos)),如果为真,则删除它:x -= (1<<pos)。我们也可以在一个操作中做到这一点:x &= ~(1<<pos)~为我们提供了补充:所有的pos位设置为零,而不是相反。x &= y将y的零位复制到x中。

现在我们如何处理数字签名?最简单的就是忽略它:unsigned xu = x;

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29388711

复制
相关文章

相似问题

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