检查数字的二进制数是否等于0和1的否定

时间:2014-02-21 18:56:39

标签: c++ bit-manipulation

我们得到一个整数,任务是判断数字的二进制表示是否包含相等数量的二进制10的数字?
我想在恒定的时间内解决问题。 我有汉明重量算法帮助计算1s的代码!
请帮助我想要0的数量!!

4 个答案:

答案 0 :(得分:1)

如果x - 是您的号码,则N1是“1”的数字,然后是

int N0 = ceil(log2(x)) - N1;

将计算“0”的数量。别忘了

#include <math.h>

答案 1 :(得分:1)

在生产代码中(我的意思是,如果不受赋值中规定的规则限制),我会这样做:

#include <iostream>
#include <bitset>

int main()
{
    int k(24); // an example integer - the one you check for equality of 0's and ones
    std::bitset<32> bs(k); // I suppose 32 bit numbers - choose your own length

    if ( 16 == bs.count() ) // 16 is half the bit length - count returns the bits that are swithced ON
    {
        std::cout << "Equal number of 1s and 0s\n";
    }
}

我的意思是在所有问题都被标记为c ++

之后

答案 2 :(得分:0)

int numberOfZeros = numberOfBinaryDigits - numberOfOnes;

其中二进制数字的数量基于用于数据的存储,或log2。

答案 3 :(得分:0)

32位整数示例:

使用位运算符(和乘法):

int bitcount(unsigned int i)
{
    // generate a bit count in each pair of bits
    i = i - ( (i >> 1) & 0x55555555);
    // generate a bit count in each nibble
    i = (i & 0x33333333) + ( (i >> 2) & 0x33333333 );
    // sum up the bits counts in the nibbles
    return (((i + (i >> 4)) & 0x0F0F0F0F) * 0x01010101) >> 24;
}

使用gcc popcount:

int bitcount(unsigned int i)
{
    return(__builtin_popcount(i));
}

使用visual studio popcnt:

int bitcount(unsigned int i)
{
    return(_popcnt(i));
}

// if(16 == bitcount(i)),则等于1和0的数字。