有符号字节中的计数 1



我在这里有这个函数来计算字节中的1位。但是,当我尝试将char值设置为200时,它会中断。但是,如果我将char更改为unsigned char,它会起作用。我很好奇为什么。

int bit_counter (char b){
char count = 0;

while (b != 0){
if (b & 0x01){ 
count ++;
}
b = b >> 1;
}
return count;
}
I have solved this issue. I masked all the bits, but the most significant bit.
int bit_counter (char b){
char count = 0;

while (b != 0){
if (b & 0x01){ 
count ++;
}
b = b >> 1;
b = (b & 0x7F);
}
return count;
}

这个非常棘手,我们必须研究char的组成。首先,当您的函数中有0 < b < 128时,它工作得很好。

您使用的是一个签名字符。有符号字符由一个符号位和7个数据位组成。这意味着您只能拥有-128到127之间的7位值。此处为字符表示。

当您指定b = 200时,您有一个溢出,这意味着您超过127,它将取另一个由200表示的值。我假设编译器采用200的二进制表示,即:

1100 1000:粗体的1是符号位的值(此处表示为负数(。

当您对b的内容进行位移位时,您只移位数据位。所以接下来的迭代看起来像:

1110 0100

1111 0010

1111 1001

11111 1111

它对应于值-1(参见二的补码。char的零表示为0000 0000。所以b永远不会是0,你陷入了一个无限循环。。。

如果你想解决这个问题,你可以使用unsigned char(没有符号位,用数据代替(,或者你可以迭代b类型的大小:

int bit_counter (char b){
char count = 0;
// sizeof(type) = byte size and -1 because there is the sign bit
for(int bitIndex = 0; bitIndex < (sizeof(char) * 8) - 1; ++bitIndex){
if (b & 0x01){ 
count ++;
}
b = b >> 1;
}
return count;
}

在现代c++中最好使用标准库std::bitset。正如许多人在评论中所说,你可能已经理解使用内置类型的缺点。

std::bitset<N>有一个函数count,它会返回设置为true(1(的位。

的几个例子

std::bitset<8> testBitSet { "11110000" }; //std::bitset<N> -- N (num of bits)
std::cout << testBitSet.count() << std::endl; //4
std::bitset<8> testBitSet2{ "11111111" };
std::cout << testBitSet2.count() << std::endl; //8
//The first 8 are considered
std::bitset<8> testBitSet4{ "00000011111111" }; //2
std::cout << testBitSet4.count() << std::endl;
//Construcing with a number
std::bitset<8> testBitSetWithNum(200);
std::cout << testBitSetWithNum.count() << std::endl; //3
std::cout << testBitSetWithNum << std::endl; //11001000

最新更新