计算char数组中的1和0的数量

时间:2017-01-14 14:11:45

标签: c customization

我正在尝试制作自定义代码,以便在将元素转换为二进制形式后计算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;
        }
    }
}

1 个答案:

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