格雷码到二进制码转换

所以我正在尝试编写一个将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;
}
我需要找到一种方法来为每次循环运行访问所需的特定位...需要以某种方式访问​​像数组一样的位... 任何想法/指针?谢谢 :)     
已邀请:
下面按照您给出的要求实现结果的按位组装。 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;
}
    
什么是你在你的问题中所写的问题我的意思是在你的声明中你可以写
B[i] = B[i+1]^G[i];
你只需要改变你的所以它从4 downto零     
以下代码应该可以解决问题:
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个位置的数字。这可以与Gray或Bin进行AND运算,将除了我们关心的所有位置零。然后使用
>>i
右移结果,将我们关心的位移到最右边。我们使用^来对这两个位进行xor,然后将其向左移动到结果位所属的位置,或者将它向内移位Bin。 这给出了一个非常有用的解释。     
几乎任何一个七位代码转换为另一个, 最简单的解决方案只是一个表,例如:     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位之间的某个时刻,你可能会想要 转向算法方法(虽然给出了记忆 在现代处理器上可用,表格方法是有效的 相当大的表)。即便如此,我也许会使用这张桌子 低阶位。     

要回复问题请先登录注册