簡體   English   中英

訪問數組中的每個第 n 個元素(漢明碼)

[英]accessing every nth element in array (hamming code)

所以基本上我正在創建一個程序,提示用戶輸入一個像“A”這樣的字符,它根據 ASCII 圖表返回他們的二進制值,在這種情況下是 01000001。應該輸出的是一個 12 位的漢明碼序列具有 8 個數據位和 4 個奇偶校驗位。 我遇到的問題是想出一種方法將正確的數據位插入每個數組 position 基本上不是 2 的冪。我應該提到數組的類型是 char。

所以應該打印出來:_ _ 0 _ 1 0 0 _ 0 0 0 1 空格代表奇偶校驗位 go 的位置。 現在我的代碼只打印出 000001000001 (到目前為止尚未確定奇偶校驗值),但我無法找到將 8 個數據位中的每一個 position 轉換為非奇偶校驗位位置的方法。

我假設我必須編輯當前涉及 for(int i = 12; i >= 0; i--) 的 for 循環,但我似乎無法弄清楚我可以使用的數學模式。 我也不確定我目前的方法是否可行。 任何提示或幫助將不勝感激。

下面基本上只是我正在努力處理的代碼部分的一個非常粗略的大綱:

for (int i=12; i>=0; i--) {
    if ((int)(n/pow(2,i)) > 0) {
        //index = 1
        n = n - pow(2,i);
    }
    else
        //index = 0
 }

您需要熟悉的操作是 mask 和 shift。 不要pow來玩弄。 這是一個用於數值計算的大型重量級 function。

有幾種方法可以生成您尋求的_ _ 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 位的掩碼。您可以使用它來檢查結果的第 11 位(m & result) != 0 如果設置了相應的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

有很多有趣的細節需要解決。 我會給你的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM