格雷码到二进制码转换

时间:2011-03-15 07:53:33

标签: c++ arrays binary gray-code

所以我正在尝试编写一个将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;
}

我需要找到一种方法来为每次循环运行访问所需的特定位...需要以某种方式访问​​像数组一样的位......

任何想法/指针?谢谢:))

7 个答案:

答案 0 :(得分:2)

以下按照您提供的要求实现结果的按位组装..

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

对于B5,我简单地将B6值右移一位,使其与灰色位G5对应,然后它们通过&操作滤除其他位。这些按位结果进行OR运算以创建整体结果。重复连续位。它甚至不值得拥有一个循环...只是额外的可能的运行时开销和源代码复杂性。

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

答案 1 :(得分:1)

我知道的将格雷码转换为二进制代码的最快方法是实现以下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;
}

答案 2 :(得分:1)

将灰阶转换为binay的更优化的代码将会

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

此技术使用按位运算符。

答案 3 :(得分:0)

你在问题​​中所写的问题是什么问题我的意思是在你的陈述中你可以写B[i] = B[i+1]^G[i];你必须改变你的所以它从4 downto零开始

答案 4 :(得分:0)

以下代码可以解决这个问题:

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

答案 5 :(得分: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进行AND运算,将除了我们关心的所有位置零。然后使用>>i右移结果,将我们关心的位移到最右边。我们使用^来对这两个位进行xor,然后将其向左移动到结果位所属的位置,或者将它向内移位Bin。

This给出了一个非常有用的解释。

答案 6 :(得分:0)

几乎任何七位代码转换为另一种代码, 最简单的解决方案只是一个表,例如:     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,0x15,0x17,0x16,0x12,0x13,0x11,0x10,         // ....     };

在8到16位之间的某个时刻,你可能会想要 转向算法方法(虽然给出了记忆 在现代处理器上可用,表格方法是有效的 相当大的表)。即便如此,我也许会使用这张桌子 低阶位。