C++ 计算整数中的位(负整数?)
我对编码真的是个新手(大约1.5周前就开始了),所以希望我在这里问这个问题不是一个太令人发指的罪行(如果是的话,我请求原谅) 我正在尝试编写一个计算整数位的函数,我编写的代码似乎非常适合计算正整数,但负整数的行为似乎非常有趣 据我所知,我的印象是一个负号整数前面有一个位,如以下示例所示:C++ 计算整数中的位(负整数?),c++,integer,bit,signed,C++,Integer,Bit,Signed,我对编码真的是个新手(大约1.5周前就开始了),所以希望我在这里问这个问题不是一个太令人发指的罪行(如果是的话,我请求原谅) 我正在尝试编写一个计算整数位的函数,我编写的代码似乎非常适合计算正整数,但负整数的行为似乎非常有趣 据我所知,我的印象是一个负号整数前面有一个位,如以下示例所示: 2: 0000 0010 -2: 1000 0010 因此理想情况下,我的函数应该是这样的:bit\u count([此处为负数])与1+bit\u counter([负数的绝对值])相同。 但事实并非
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位。此外,显示的代码不计算设置的位的总数,而是计算设置位位置的次数。总之,与六年前接受的答案相比,这并不是一个改进……请注意,不能保证您操作的平台实际使用此编码(尽管可能性很大)。