簡體   English   中英

格雷碼到二進制碼的轉換

[英]Gray Code to Binary Code Conversion

所以我正在嘗試編寫一個函數,將 7 位格雷碼轉換為相應的 7 位二進制碼。

轉換方法如下——

  • 灰度值位 ---- MS 位 > (G6) G5 G4 G3 G2 G1 G0 *
  • 二進制值位 -- MS 位 > (B6) B5 B4 B3 B2 B1 B0 *

  • B6 = G6 // MS 位始終相同

  • B5 = B6 ^ G5 // 將這些位異或“或”在一起以構建 7 位二進制值
  • B4 = B5 ^ G4
  • B3 = B4 ^ G3
  • B2 = B3 ^ G2
  • B1 = B2 ^ G1
  • B0 = B1 ^ G0

到目前為止,這是我的功能-

unsigned short Gray_to_Bin(unsigned short Gray)
{
unsigned short Bin;
unsigned short i;
unsigned short mask;

mask = 0x40; // Initial mask
Bin = 0;

Gray &= 0x7f; // Mask bit 7 (Index Bit)
Bin = Gray & mask; // Set B6 = G6

for (i=0; i<6; i++) // Set B5, B4, ..., B0
{

// Code needed here!!

}
return Bin;
}

我需要找到一種方法來訪問每次循環運行所需的特定位......需要像我可以以某種方式訪問​​數組一樣訪問這些位......

任何想法/指示? 謝謝 :)

下面按照您給出的要求實現結果的按位組裝。

  • B6 = G6 // MS 位始終相同
  • B5 = B6 ^ G5
  • ...

對於 B5,我只是將 B6 值右移一位,使其與灰色位 G5 相對應,對它們進行異或,然后用&操作過濾掉其他位。 這些按位結果進行或運算以創建整體結果。 對連續位重復。 甚至不值得為此循環......只是額外的可能運行時開銷和源代碼復雜性。

unsigned short gray_to_binary(unsigned short gray)
{
    unsigned short result = gray & 64;
    result |= (gray ^ (result >> 1)) & 32;
    result |= (gray ^ (result >> 1)) & 16;
    result |= (gray ^ (result >> 1)) & 8;
    result |= (gray ^ (result >> 1)) & 4;
    result |= (gray ^ (result >> 1)) & 2;
    result |= (gray ^ (result >> 1)) & 1;
    return result;
}

我所知道的將格雷碼轉換為二進制代碼的最快方法是實現以下 Java 方法:

private static int grayToBin(int gray) {
   int bin = 0;
   while (gray != 0) {
      int decremented = gray - 1;
      bin ^= gray;
      bin ^= decremented;
      gray &= decremented;
   }
   return bin;
}

將灰色轉換為二進制的更優化代碼將是

int grayToBinary(int gray)
{
int binary=0;
for(;gray;gray=gray>>1)
{
    binary^=gray; //binary=binary^gray;
}
return binary;
}

此技術使用按位運算符。

您在問題中所寫的內容有什么問題,我的意思是在您的陳述中,您可以寫B[i] = B[i+1]^G[i]; 你只需要改變你的 for 所以它從 4 降到零

以下代碼應該可以解決問題:

for (int i = 0; i < 6; ++ i) {
    unsigned short j = 5 - i;
    unsigned short m = 1 << j;
    Bin |= ((Bin >> 1) & m) ^ (Gray & m);
}

我認為它應該是這樣的:

for(i=5; i >= 0; i--){
    Bin = Bin | ((Gray & 1<<i)>>i ^ (Bin & 1<<(i + 1))>>i)<<i;
}

要訪問特定位,您可以使用1<<i將“1”左移 i 次,產生一個數字,除了在從右數第 i 位的一個 1 之外全為零。 這可以與 Gray 或 Bin 進行 AND 運算,將除我們關心的位之外的所有位歸零。 然后使用>>i將結果右移,將我們關心的位移到最右邊。 我們使用 ^ 對兩位進行異或,然后將其左移到結果位所屬的位置,然后將其與 Bin 進行 OR 運算。

給出了一個非常有用的解釋。

對於從一個七位代碼到另一個的任何轉換,最簡單的解決方案就是一個表格,例如: static unsigned char fromGray[] = { 0x00, 0x01, 0x03, 0x02, 0x06, 0x07, 0x05, 0x04, 0x0C, 0x0D , 0x0F, 0x0E, 0x0A, 0x0B, 0x09, 0x08, 0x18, 0x18, 0x1B, 0x1A, 0x1E, 0x1F, 0x1D, 0x1C, 0x14, 0x,10, 0x,10, 0x,10... . };

在 8 位和 16 位之間的某個時間點,您可能希望轉向算法方法(盡管考慮到現代處理器上可用的內存,表方法適用於相當大的表)。 即便如此,我也可能會將該表用於低位。

暫無
暫無

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

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