【发布时间】:2018-06-17 16:14:32
【问题描述】:
我是 C 新手,我想根据以下过程将输入位存储到输出数组中。
input MSB LSB MSB LSB MSB
[169,48,0] = 1 0 1 0 1 0 0 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0
程序应遍历输入数据以查找起始索引存在于哪个字节中,并提取从起始索引到结束索引的位并将其存储在输出[]中。例如,我的起始索引是 4,它存在于 input[0] 中,我的结束索引是 13。所以我需要从位位置 4 提取到 13 并将其放在 output[] 中。
当我说位位置 4 到 13 时,我的意思是 - 我需要来自 input[0] 的 bits[4 - 7] = {0 1 0 0 1} 和 bits[8 - 13] = {1 1 0 0 0 0} 来自输入[1]
expected
output
[9, 48,0] = 0 0 0 0 1 0 0 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0
我尝试用 C 编程,但不幸的是我没有成功,位循环是通过 LSB 到 MSB。我需要遍历第一个字节并继续到下一个字节并重复直到存在结束位置的字节索引。
#include<stdio.h>
int main()
{
unsigned char input[3] = {169,48,0};
unsigned char output[3]= {0};
int i, start = 4, end = 13;
for(i=0; i<3; i++)
{
output[i] = (input[i] >> (start)) & ((1u << (end)) -1u);
printf("%u\n",output[i]);
}
return 0;
}
程序循环遍历所有 3 个输入字节,并从位索引 4 存储到该特定字节的结束索引,即 7。
output
[10, 3, 0] = 0 0 0 0 1 0 1 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0
我想检查我的起始索引是否存在于 input[0] 或 input[1] 或 . . . input[n],根据开头显示的预期输出,从起始索引复制并存储到结束索引(可能存在于任何字节位置)。
如果你能纠正程序逻辑,我会很高兴,因为我是 C 新手。
【问题讨论】:
-
您认为位 0 是数组的哪一端,我无法确定预期的输出。如果位 0 是右侧字节的 LSB,则位 3-11 都是
0,输出应该都是0。如果位 0 是左侧字节的 LSB,我仍然无法弄清楚,因为输出位 0 是1,而您说您忽略了该位。 -
如果您要提取的位数始终为 8(如您的示例中所示),则此问题让人想起计算 8 位 CRC。但我认为您想移动 任意 位数 - 对吗?
-
this的一些变体
-
@DavidCollins 不,它并不总是 8 位。我需要提取任意数量的位。
标签: c