在字符数组中搜索多次出现的值,然后列出出现次数。 VC ++

时间:2009-06-08 23:26:23

标签: c++ arrays

我正在尝试编写一个小程序,它将为从ASCII字符数组中提取的Hex和Binary值生成奇偶校验位。我总共有3个字符数组。例如:

const char *caASCII[] = {"A", "B", "C", ...};

const char *caASCIIBinary[] = {"01000001", "01000010", "01000011", ...};

const char *caASCIIHex[] = {"41", "42", "43", ...};

因此,我输入“A”并在二进制和十六进制数组中找到相应的值,然后显示它们。我有一个线性搜索功能,可以进行搜索,效果很好。

我想知道是否可以计算,例如,在其中一个二进制值中出现“1”的次数,然后从中判断(如果1的数量是偶数或奇数)添加“二进制值末尾的“0”或“1”。十六进制值我想我必须除以2才能看出它是偶数还是奇数。

我开始认为我必须将数组更改为不同的类型,可能是整数。关于我如何处理这个问题的任何建议?

3 个答案:

答案 0 :(得分:1)

三阵列的想法是一个巨大的废话:这些是很少通过少量操作计算的信息。 例如,要知道二进制代表中的“1”数:

  int bits_on(char yourchar) {
    int count = 0;
    while (yourchar > 0) {
      count += yourchar % 2;
      yourchar >>= 1;
    }
    return count;
  }

“如果它是偶数则添加1”

int newInt = yourChar << 1;
newInt += bits_on(yourchar) % 2 == 0 ? 1 : 0;

答案 1 :(得分:0)

您是否只是在寻找计算角色的功能?你可以自己轻松写一个:

size_t strcnt(const char *s, char c) {
  size_t count = 0;
  while (*s)
    if (*s++ == c) 
      count++;
  return count;
}

您可以这样使用它:

#include <iostream>
// ...

size_t count = strcnt(caASCIIBinary[2], '1')
std::cout << count << " bits set in " << caASCIIBinary[2] << std::endl;

答案 2 :(得分:0)

对于问题的方向回答,这会计算二进制字符串中1的数量:

#include <algorithms>
#include <string>

const std::string caASCIIBinary[] = {"01000001", "01000010", "01000011", ...};

int num_ones = std::count(caASCIIBinary[5].begin(), caASCIIBinary[5].end(), '1');

如果你完全坚持使用char *而不是字符串(不要这样做):

int num_ones = std::count(caASCIIBinary[5], caASCIIBinary[5]+strlen(caASCIIBinary[5]), '1');

但是,我不确定这是你真正想做的事情。听起来,给定一个char,你想输出一个附加了奇偶校验位的字符串:

#include <bitset>
#include <limits.h>
#include <algorithms>
using namespace std;

string parity_string(char ch){
   string str(bitset<CHAR_BIT>(ch).to_string<char,char_traits<char>,allocator<char> >());
   if(count(str.begin(), str.end(), '1') % 2) { str.append("1"); }
   else { str.append("0"); }
   return str;
}

通过构造已经附加了奇偶校验位的bitset,可能更容易实现它,但我必须考虑它。

修改:Bam:

string parity_string(char ch){
   bitset<CHAR_BIT+1> bs(ch);
   bs[CHAR_BIT] = bs.count() % 2;
   return bs.to_string<char,char_traits<char>,allocator<char> >();
}