c-访问数组中的每个第n个元素(汉明码)

问题描述 投票:0回答:1

因此,基本上,我正在创建一个程序,提示用户输入类似'A'的字符,并根据ASCII图表(在这种情况下为01000001)返回其二进制值。应该输出的是12位汉明具有8个数据位和4个奇偶校验位的代码序列。我遇到的麻烦是想出一种将正确的数据位插入每个数组位置的方法,该方法基本上不是2的幂。我应该提到数组的类型是char。

所以应该打印出来:_ _ 0 _ 1 0 0 _ 0 0 0 1,其中空格代表奇偶校验位的去向。现在,我的代码仅打印出000001000001(到目前为止尚未确定奇偶校验值),但是我无法找到一种方法将8个数据位中的每一个定位到非奇偶校验位位置。

我以为我必须编辑我的for循环,该循环目前涉及for(int i = 12; i> = 0; i--),但是我似乎无法弄清楚我可以使用的数学模式。我不确定我目前的方法是否可行。任何提示或帮助,将不胜感激。

下面基本上只是我正在苦苦挣扎的那部分代码的粗略概述:

for (int i=12; i>=0; i--) {
    if ((int)(n/pow(2,i)) > 0) {
        //index = 1
        n = n - pow(2,i);
    }
    else
        //index = 0
 }
c binary ascii bit parity
1个回答
1
投票

您需要熟悉的操作是遮罩和移位。 使用pow进行位旋转。这是一个很大的重量级函数,用于数值计算。

有几种方法可以生成您想要的_ _ 0 _ 1 0 0 _ 0 0 0 1模式。一种是先清除最右边的空间。如果x保持原始值0100001,则第一步是屏蔽掉除最后4位以外的所有位。这是x & 0xfu&是逻辑“与”。其他所有位都可以用x & ~0xfu屏蔽。 ~按位“不”。现在,您想将这些其他位左移一位,并使用“或”将它们与低阶4位组合。因此,我们共有:

unsigned x = 'A';
unsigned a = (x & 0xfu) | ((x & ~0xfu) << 1);

要将最高的位向左移动一位,请遵循相同的步骤,只是现在您要让最右边的[[8位保持在原来的位置,而第9位及更高的位向左移动一位。您需要的遮罩是0xffu。因此,我们最终得到

unsigned result = (a & 0xffu) | ((a & ~0xffu) << 1);
现在您可以在奇偶校验位中“或”,然后用类似的方法打印出按位表示:

for (unsigned m = 0x800; m; m >>= 1) printf("%d", (m & result) != 0);

再次0x800是位11的掩码。您可以使用它用(m & result) != 0检查结果的位11。如果设置了result的对应位,则其值为1,否则为0,恰好是您要打印的内容。 for循环的每个连续迭代都会将遮罩向右移动一位。当该位完全移出时,循环停止。这会在12次迭代后发生,因此您需要打印12位,这似乎是您想要的。

注意,我一直使用无符号类型。这在这里不是绝对必要的,但是使用无符号类型进行位操作通常不会出现错误,因为符号扩展会导致意外的结果。

总而言之,您可以使用0xff作为输入来进行测试,以查看奇偶校验位所属的“孔”:

#include <stdio.h> int main(void) { unsigned x = 0xffu; unsigned a = (x & 0xfu) | ((x & ~0xfu) << 1); unsigned result = (a & 0xffu) | ((a & ~0xffu) << 1); for (unsigned m = 0x800; m; m >>= 1) printf("%d", (m & result) != 0); return 0; }

如您所愿和期望的那样打印001011101111。>>

有很多有趣的细节需要解决。我会帮你的忙。

© www.soinside.com 2019 - 2024. All rights reserved.