![](/img/trans.png)
[英]Convert a character array of binary numbers into a counter of Gray Code in C++
[英]Gray Code to Binary Code Conversion
所以我正在嘗試編寫一個函數,將 7 位格雷碼轉換為相應的 7 位二進制碼。
轉換方法如下——
二進制值位 -- MS 位 > (B6) B5 B4 B3 B2 B1 B0 *
B6 = G6 // MS 位始終相同
到目前為止,這是我的功能-
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;
}
我需要找到一種方法來訪問每次循環運行所需的特定位......需要像我可以以某種方式訪問數組一樣訪問這些位......
任何想法/指示? 謝謝 :)
下面按照您給出的要求實現結果的按位組裝。
對於 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.