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 // 异或位一起构造 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;
}

我需要找到一种方法来访问每次循环运行所需的特定位......需要像使用数组一样访问这些位......

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

4

7 回答 7

2

以下实现了按照您给出的要求对结果进行按位组装..

  • 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;
}
于 2011-03-15T08:31:32.773 回答
2

将灰色转换为二进制的更优化的代码将是

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

该技术使用按位运算符。

于 2020-05-23T17:34:47.173 回答
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;
}
于 2019-12-27T13:24:08.263 回答
0

你在问题中写的内容有什么问题我的意思是你的声明你可以写B[i] = B[i+1]^G[i];你只需要改变你的for所以它从4下降到零

于 2011-03-15T08:11:53.167 回答
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,将我们关心的位移动到最右边。我们使用 ^ 对这两个位进行异或,然后将其左移到结果位所属的位置,然后将其与 Bin 进行或运算。

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

于 2011-03-15T08:31:12.837 回答
0

以下代码应该可以解决问题:

for (int i = 0; i < 6; ++ i) {
    unsigned short j = 5 - i;
    unsigned short m = 1 << j;
    Bin |= ((Bin >> 1) & m) ^ (Gray & m);
}
于 2011-03-15T08:26:34.133 回答
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, //, ... 0x1 . };

在 8 位到 16 位之间的某个时间点,您可能希望转向算法方法(尽管考虑到现代处理器上可用的内存,表方法对于相当大的表有效)。即使那样,我也可能会将该表用于低位。

于 2011-03-15T08:49:50.097 回答