c++cgray-code

Gray codes addition


Is there any known way to compute the addition (and maybe the subtraction) of two Gray codes without having to convert the two Gray codes to regular binary, perform a binary addition then convert the result back to a Gray code? I managed to write increment and decrement functions, but the addition and subtraction seem even less documented and harder to write.


Solution

  • In this document under #6, there is an algorithm for serial Gray code addition (copied directly; note, that is xor):

    procedure add (n: integer; A,B:word; PA,PB:bit;
                   var S:word; var PS:bit; var CE, CF:bit);
    var i: integer; E, F, T: bit;
    begin
       E := PA; F := PB;
       for i:= 0 to n-1 do begin {in parallel, using previous inputs}
           S[i] := (E and F) ⊕ A[i] ⊕ B[i];
           E := (E and (not F)) ⊕ A[i];
           F := ((not E) and F) ⊕ B[i];
       end;
       CE := E; CF := F;
    end;
    

    This adds the Gray code words A and B to form the Gray code word S. The operand parities are PA and PB, the sum parity is PS. This propagates two carry bits internally, E and F, and produces two external carry bits CE and CF

    Unfortunately, it doesn't state anything about subtraction, but I assume, when you can encode negative numbers, you can use addition for that.