我正在尝试编写一个小程序,它将为从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才能看出它是偶数还是奇数。
我开始认为我必须将数组更改为不同的类型,可能是整数。关于我如何处理这个问题的任何建议?
答案 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> >();
}