unsigned char到8个原始位的unsigned char数组

时间:2014-11-27 20:25:55

标签: c arrays bit unsigned-char

我正在尝试使用给定的 unsigned char 并将 8位值存储在大小为8的 unsigned char数组中{{{ 1}})。

所以给定unsigned char 1 bit per array index

我想创建一个包含A unsigned char数组(每个索引一个数字)

实现这一目标的最有效方法是什么?感恩节快乐!

3 个答案:

答案 0 :(得分:1)

您可以按照建议使用位运算符。

#include <stdio.h>

main() {
    unsigned char input_data = 8;
    unsigned char array[8] = {0};
    int idx = sizeof(array) - 1;
    while (input_data > 0) {
        array[idx--] = input_data & 1;
        input_data /= 2; // or input_data >>= 1;
    }

    for (unsigned long i = 0; i < sizeof(array); i++) {
        printf("%d, ", array[i]);
    }
}

答案 1 :(得分:1)

取值,右移并掩盖它以保持低位。将低位的值添加到字符“0”,以便得到“0”或“1”并将其写入数组:

unsigned char val = 65;
unsigned char valArr[8+1] = {};

for (int loop=0; loop<8; loop++)
    valArr[7-loop] = '0' + ((val>>loop)&1);

printf ("val = %s", valArr);

答案 2 :(得分:1)

最快的(不确定你是否通过“有效”来表示)这样做的方式可能就像

void char2bits1(unsigned char c, unsigned char * bits) {
    int i;
    for(i=sizeof(unsigned char)*8; i; c>>=1) bits[--i] = c&1;
}

该函数将char转换为第一个参数,并使用相应的位模式填充数组bits。它在我的笔记本电脑上运行2.6 ns。它假设8位字节,但不是char的长度,并且不需要事先对输入数组进行零初始化。

我没想到这是最快的方法。我的第一次尝试看起来像这样:

void char2bits2(unsigned char c, unsigned char * bits) {
    for(;c;++bits,c>>=1) *bits = c&1;
}

我认为通过避免数组查找,以自然顺序循环(以产生与请求相反的顺序生成位的代价),以及在c为零时停止(因此,在调用函数之前,bits数组需要进行零初始化。但令我惊讶的是,这个版本的运行时间为5.2 ns,是上述版本的两倍。

调查相应的组件显示差异是循环展开,这是在前一种情况下进行而不是后者。因此,这是现代编译器和现代CPU如何具有令人惊讶的性能特征的说明。

编辑:如果您确实希望结果中的无符号字符为字符'0''1',请使用此修改后的版本:

void char2bits3(unsigned char c, unsigned char * bits) {
    int i;
    for(i=sizeof(unsigned char)*8; i; c>>=1) bits[--i] = '0'+(c&1);
}