您的代码中存在问题:
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); } }