计算整数位数(负整数?)

时间:2014-01-09 05:42:33

标签: c++ integer bit signed

我真的很喜欢编码(就像大约1.5周前开始的那样),所以希望我在这里提出这个问题并不是一件令人发指的罪行(如果是的话,我请求原谅)。

我正在尝试编写一个计算整数位的函数,而我编写的代码似乎可以很好地计算正整数,但负整数似乎非常有趣。

根据我所学到的,我的印象是负面的有符号整数只是在它前面有点像下面的例子:

 2:  0000 0010
-2:  1000 0010

理想情况下,我的功能应该是这样的:bit_count([negative number here])1 + bit_counter([absolute value of negative number])

相同

但事实并非如此。

这是我的功能:

    int bit_count(int byte)
    {
        int bit;
        int tally;
        tally = 0;
        for (bit = 0x80; bit > 0; bit = bit >> 1)
        {
            if ((byte & bit) != 0)
                    ++tally;
        }
        return (tally);
    }

一些示例数据:

bit_count(-1)会产生8 bit_count(-6)导致6 bit_count(-4)导致6

依旧......

我有一个朋友,我有相当的信任建议,根据机器,在我的位计数功能包括的签名位前面实际上有更多元数据,但我不知道我是什么我需要做的就是纠正它。

由于

4 个答案:

答案 0 :(得分:1)

正如其他人在评论中指出的那样,虽然在确定有符号整数的符号时检查最高有效位是有效的,但字节的其余部分也会改变。

换句话说,你的代码工作正常,但是关于负整数表示的前提是错误的。

有符号整数中使用的机制称为二进制补码,本质上意味着取2 ^ n,其中n是位数,减去整数的绝对值得到负值。

因此

-2

1111 1110   

而不是

1000 0010
正如你所料的那样。这样做的原因是它确保标准算术运算适用于签名的整数。

答案 1 :(得分:0)

此行之后:tally = 0;为您的预期结果添加此项,因为负数是2的补码。 if(byte< 0){tally = 1; byte = -1 * byte;}

答案 2 :(得分:0)

int bit_count(int num)
{
    int count = 0;
        for (unsigned int bit = 1; bit <= num && bit > 0; bit <<= 1){
           if (num & bit){ 
               count++;
           }
        }  
    return count;
}

以上答案也不错且有效。还有。此代码段对我有用。

我使用了unsigned int,因为它不考虑最左边的位,并且预期输出将减少1个计数。

我喜欢听听建议。谢谢你,欢迎你。

答案 3 :(得分:-2)

整数最多可以包含32位

int n = given(say -25)
int count[32] = {0}; 
for (int i = 0; i < 32; i++) {
    if ((n >> i) & 1) {
        count[i]++;
    }
}

然后我们可以迭代每个位置。