2011-03-15 99 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位之间的某一点,你可能会想 转移到算法方法(虽然鉴于现代处理器的可用内存 ,该表的方法是有效的 相当大表)。即使那样,我可能会使用低位的 表。