如何在数组中存储位串?

时间:2011-04-24 17:30:49

标签: c++ c

如何计算8位字符串中出现次数1。例如10110001。 位字符串取自用户。像10110001 应该使用什么类型的数组来存储c?

中的这个位串

4 个答案:

答案 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
}

Online Test at Ideone

答案 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位值调整算法即可。