[英]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.