我真的很喜欢编码(就像大约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
依旧......
我有一个朋友,我有相当的信任建议,根据机器,在我的位计数功能包括的签名位前面实际上有更多元数据,但我不知道我是什么我需要做的就是纠正它。
由于
答案 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]++;
}
}
然后我们可以迭代每个位置。