2011-03-15 66 views
1

所以我想寫一個函數,將7位格雷碼轉換爲相應的7位二進制代碼。格雷碼到二進制代碼轉換

下面是如何轉換 -

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

  • B6 = G6 // MS比特總是相同

  • B5 B6 =^G5 //異 'OR' 的位一起構建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; 
} 

我需要到f ind一種方法來訪問每個運行循環所需的特定位...需要像我可以以某種方式訪問​​位...

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

回答

0

什麼是正是你在你的問題,我的意思是在你的聲明中寫道這個問題,你可以寫B[i] = B[i+1]^G[i];你只需要改變你的,因此從4變爲零DOWNTO

+0

那麼,代碼不是陣列形式 - 進來的灰色代碼將像0101 1100.我不認爲你可以像訪問一個數組中的每個數字短代碼? (請原諒我的無知,我對此很陌生:P)。 謝謝! – 2011-03-15 08:17:50

0

下面的代碼應該做的伎倆:

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

@S_Wheelan:不要編輯人員代碼。正確的拼寫/語法很好。但是糾正代碼是一個無聊的領域。 – 2011-04-04 19:41:35

0

我認爲它應該是這個樣子:

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

要訪問一個特定位,可以使用1<<i向左移位「1」i次,產生除了右邊第i個位置之外全爲零的數字。這可以與Gray或Bin進行與運算,將除了我們所關心的位以外的所有位置零。然後使用>>i將結果右移,將我們關心的位移到最右邊。我們使用^來對兩個比特進行異或運算,然後將其左移到所得比特所屬的位置,或者將它輸入Bin。

This給出了非常有用的解釋。

2

下實現結果的下列你給要求的按位組件..

  • B6 = G6 // MS比特總是相同
  • B5 B6 =^G5
  • ...

對於B5,我簡單位位移右移一位,以便將其與灰色位G5對應的B6值,XOR他們然後過濾掉與&操作的其它位。這些按位結果進行「或」操作以創建總體結果。重複連續的位。這甚至不值得有一個循環......只是額外的運行時間開銷和源代碼複雜性。

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; 
} 
0

幾乎有關的一個7位代碼到另一處的任何轉換, 最簡單的解決方案僅僅是一個表,例如: 靜態無符號字符fromGray [] = { 0×00 0×01,×03,0×02, 0×06,0×07,0×05,×04, 0x0C,0X0D,爲0x0F,0x0E的,的0x0A,0x0B中,0×09,0x08時, 爲0x18,爲0x18,0x1B,0x1A的,0X1E,0x1F的,0x1D,爲0x1C, 0×14,×15,0×17,0x16 ,0x12,0x13,0x11,0x10, // ... };

在第8位和16位之間的某一點,你可能會想 轉移到算法方法(雖然鑑於現代處理器的可用內存 ,該表的方法是有效的 相當大表)。即使那樣,我可能會使用低位的 表。