这个问题不是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?
发布于 2015-04-01 11:21:36
unsigned bits, var = (x < 0) ? -x : x;
for(bits = 0; var != 0; ++bits) var >>= 1;这应该是为了你。
发布于 2015-04-01 10:57:26
警告:前面有数学。如果你很敏感,跳到TL,博士。
您真正要寻找的是设置的最高位。让我们写出二进制数10001 11010111的实际含义:
x = 1 * 2^(12) + 0 * 2^(11) + 0 * 2^(10) + ... + 1 * 2^1 + 1 * 2^0其中*表示乘法,^表示指数。
你可以把这个写成
2^12 * (1 + a)其中0 < a < 1 (准确地说,是a = 0/2 + 0/2^2 + ... + 1/2^11 + 1/2^12)。
如果你取对数(基数2),让我们用log2表示它,你得到的这个数字
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数所需的最小位数由
numberOfBits = floor(log2(x)) + 1发布于 2015-04-01 14:15:28
你在寻找这个数字中最重要的部分。让我们暂时忽略负数。我们怎么能找到它?那么,让我们看看,在整数为零之前,我们需要将多少位位设置为零。
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<< pos是pos位置上的1位移位。因此,我们可以检查if (x & (1<<pos)),如果为真,则删除它:x -= (1<<pos)。我们也可以在一个操作中做到这一点:x &= ~(1<<pos)。~为我们提供了补充:所有的pos位设置为零,而不是相反。x &= y将y的零位复制到x中。
现在我们如何处理数字签名?最简单的就是忽略它:unsigned xu = x;
https://stackoverflow.com/questions/29388711
复制相似问题