如何计算8位字符串中出现次数1。例如10110001。 位字符串取自用户。像10110001 应该使用什么类型的数组来存储c?
中的这个位串答案 0 :(得分:5)
简短而简单。使用std::bitset
(C ++)
#include <iostream>
#include <bitset>
int main()
{
std::bitset<8> mybitstring;
std::cin >> mybitstring;
std::cout << mybitstring.count(); // returns the number of set bits
}
答案 1 :(得分:1)
根本不使用数组,使用std :: string。这使您可以更好地处理错误。您可以编写如下代码:
bitset <8> b;
if ( cin >> b ) {
cout << b << endl;
}
else {
cout << "error" << endl;
}
但无法找出导致错误的字符。
答案 2 :(得分:1)
您可能使用unsigned int
将这些位存储在C中。
如果您正在使用GCC,那么您可以使用__builtin_popcount
来计算一位:
内置功能:
int __builtin_popcount (unsigned int x)
返回x中的1位数。
这应该解决支持它的CPU上的单个指令。
答案 3 :(得分:0)
来自黑客的喜悦:
For machines that don't have this instruction, a good way to count the number
of 1-bits is to first set each 2-bit field equal to the sum of the two single
bits that were originally in the field, and then sum adjacent 2-bit fields,
putting the results in each 4-bit field, and so on.
所以,如果x
是一个整数:
x = (x & 0x55555555) + ((x >> 1) & 0x55555555);
x = (x & 0x33333333) + ((x >> 2) & 0x33333333);
x = (x & 0x0F0F0F0F) + ((x >> 4) & 0x0F0F0F0F);
x = (x & 0x00FF00FF) + ((x >> 8) & 0x00FF00FF);
x = (x & 0x0000FFFF) + ((x >>16) & 0x0000FFFF);
x
现在将包含1位数。只需使用8位值调整算法即可。