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

标签 c arrays bit unsigned-char

我正在尝试获取给定的 unsigned char 并将 8 位 值存储在大小为 8 的 unsigned char 数组 中(每个数组索引 1 位)。

所以给定 unsigned char A

我想创建一个无符号字符数组,其中包含0 1 0 0 0 0 0 1(每个索引一个数字)

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

最佳答案

最快的(不确定这是否是您所说的“有效”)的方式可能是这样的

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

该函数将要转换的字符作为第一个参数,并用相应的位模式填充数组bits。它在我的笔记本电脑上运行时间为 2.6 ns。它假定 8 位字节,但不假定 char 有多少字节长,并且不需要预先将输入数组初始化为零。

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

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

我认为通过避免数组查找、按自然顺序循环(以与请求的顺序相反的顺序产生位为代价)以及在 c 为零时立即停止(因此位数组需要在调用函数之前进行零初始化)。但令我惊讶的是,这个版本的运行时间为 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);
}

关于c - unsigned char 到 8 个原始位的 unsigned char 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27178256/

相关文章:

javascript - 未知的数组表示法 javascript

c# - 从 C# 中的值解码位掩码

c - 从不兼容的指针类型初始化 [默认启用] - 怎么了?

c - 在C中搜索子字符串的位置时如何允许字符串中存在空格?

c - 为什么此C代码的float和类型float不能输出正确的结果?

javascript - 将项目添加到数组或替换它(如果它具有相同的 ID)

c++ - 奇怪的编译输出

arrays - 如何在 Swift 中打乱数组?

python - 翻转一个字节的最后一位

c - 在十六进制数组中写入位