我正在尝试使用给定的 unsigned char 并将 8位值存储在大小为8的 unsigned char数组中{{{ 1}})。
所以给定unsigned char 1 bit per array index
我想创建一个包含A
的 unsigned char数组(每个索引一个数字)
实现这一目标的最有效方法是什么?感恩节快乐!
答案 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);
}