因此,我试图编写一个将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对应,对它们进行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;
    }
    

    09-26 02:32