我正在尝试制作自定义代码,以便在将元素转换为二进制形式后计算char类型数组的每个元素中的零和1的数量。这是我的代码。如果有更好的方法来写它,请提及它。这适用于嵌入式系统。提前谢谢。
void counter(unsigned short bits_num, short sizeof_array, char array[]) {
unsigned char zero = 0, one = 0;
while (bits_num && sizeof_array) {
if (array[sizeof_array - 1] & 1)
one++;
else
zero++;
array[sizeof_array - 1] = array[sizeof_array - 1] >> 1;
bits_num--;
if (!bits_num) {
bits_num = 8;
printf("zeros number is %i, ones number is %i in element: %x\n",
zero, one, sizeof_array - 1);
sizeof_array--;
zero = 0;
one = 0;
}
}
}
答案 0 :(得分:5)
您的代码存在问题:
bits_num
参数是什么?它似乎是每个数组元素的位数,但是在第一个字节后强制它回到8
。sizeof_array
的类型为short
?阵列可能具有更大的尺寸,尤其是在现代系统上。unsigned char
,因为某些架构上默认情况下可能会对char
类型进行签名,而正确的移位负值是实现定义的。这是一个更简单的版本:
void counter(int bits_num, size_t array_size, const char *array) {
for (size_t i = 0; i < array_size; i++) {
unsigned char x = (unsigned char)array[i];
int bits = 0;
for (int j = 0; j < bits_num; j++) {
bits += x & 1;
x >>= 1;
}
printf("zeros number is %d, ones number is %d in element %x\n",
bits_num - bits, bits, i);
}
}