Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 计算整数中的位(负整数?)_C++_Integer_Bit_Signed - Fatal编程技术网

C++ 计算整数中的位(负整数?)

C++ 计算整数中的位(负整数?),c++,integer,bit,signed,C++,Integer,Bit,Signed,我对编码真的是个新手(大约1.5周前就开始了),所以希望我在这里问这个问题不是一个太令人发指的罪行(如果是的话,我请求原谅) 我正在尝试编写一个计算整数位的函数,我编写的代码似乎非常适合计算正整数,但负整数的行为似乎非常有趣 据我所知,我的印象是一个负号整数前面有一个位,如以下示例所示: 2: 0000 0010 -2: 1000 0010 因此理想情况下,我的函数应该是这样的:bit\u count([此处为负数])与1+bit\u counter([负数的绝对值])相同。 但事实并非

我对编码真的是个新手(大约1.5周前就开始了),所以希望我在这里问这个问题不是一个太令人发指的罪行(如果是的话,我请求原谅)

我正在尝试编写一个计算整数位的函数,我编写的代码似乎非常适合计算正整数,但负整数的行为似乎非常有趣

据我所知,我的印象是一个负号整数前面有一个位,如以下示例所示:

 2:  0000 0010
-2:  1000 0010
因此理想情况下,我的函数应该是这样的:
bit\u count([此处为负数])
1+bit\u counter([负数的绝对值])相同。

但事实并非如此

以下是我的功能:

    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);
    }
一些样本数据:

位计数(-1)
结果为8
位计数(-6)
结果为6
位计数(-4)
结果为6

等等

我有一个朋友,我非常信任他,他建议根据机器的不同,在我的位计数函数包含的签名位前面实际上有更多的元数据,但我不知道我需要做什么来纠正这一点


谢谢

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

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

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

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

-因此,2是

1111 1110   
而不是

1000 0010
如你所料。这样做的原因是它确保了标准算术运算对有符号整数有效

int位计数(int num)
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;
}
{ 整数计数=0;
对于(无符号整数位=1;位0;位整数的最大值为32位

int n=给定(比如-25)
整数计数[32]={0};
对于(int i=0;i<32;i++){
如果((n>>i)和1){
计数[i]++;
}
}

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

是的,最高有效位在有符号时通常表示负数,但其余的也会改变。查找两个补码-翻转位并添加一个以从+ve变为-ve。该语言提供的唯一保证是
int
的宽度为16位或更多。它不需要是倍数e为8位。此外,显示的代码不计算设置的位的总数,而是计算设置位位置的次数。总之,与六年前接受的答案相比,这并不是一个改进……请注意,不能保证您操作的平台实际使用此编码(尽管可能性很大)。