52 lines
1.2 KiB
ObjectPascal
52 lines
1.2 KiB
ObjectPascal
MODULE GrayCodes;
|
|
IMPORT StdLog,SYSTEM;
|
|
|
|
PROCEDURE Encode*(i: INTEGER; OUT x: INTEGER);
|
|
VAR
|
|
j: INTEGER;
|
|
s,r: SET;
|
|
BEGIN
|
|
s := BITS(i);j := MAX(SET);
|
|
WHILE (j >= 0) & ~(j IN s) DO DEC(j) END;
|
|
r := {};IF j >= 0 THEN INCL(r,j) END;
|
|
WHILE j > 0 DO
|
|
IF ((j IN s) & ~(j - 1 IN s)) OR (~(j IN s) & (j - 1 IN s)) THEN INCL(r,j-1) END;
|
|
DEC(j)
|
|
END;
|
|
x := SYSTEM.VAL(INTEGER,r)
|
|
END Encode;
|
|
|
|
PROCEDURE Decode*(x: INTEGER; OUT i: INTEGER);
|
|
VAR
|
|
j: INTEGER;
|
|
s,r: SET;
|
|
BEGIN
|
|
s := BITS(x);r:={};j := MAX(SET);
|
|
WHILE (j >= 0) & ~(j IN s) DO DEC(j) END;
|
|
IF j >= 0 THEN INCL(r,j) END;
|
|
WHILE j > 0 DO
|
|
IF ((j IN r) & ~(j - 1 IN s)) OR (~(j IN r) & (j - 1 IN s)) THEN INCL(r,j-1) END;
|
|
DEC(j)
|
|
END;
|
|
i := SYSTEM.VAL(INTEGER,r);
|
|
END Decode;
|
|
|
|
|
|
PROCEDURE Do*;
|
|
VAR
|
|
grayCode,binCode: INTEGER;
|
|
i: INTEGER;
|
|
BEGIN
|
|
StdLog.String(" i ");StdLog.String(" bin code ");StdLog.String(" gray code ");StdLog.Ln;
|
|
StdLog.String("---");StdLog.String(" ----------------");StdLog.String(" ---------------");StdLog.Ln;
|
|
FOR i := 0 TO 32 DO;
|
|
Encode(i,grayCode);Decode(grayCode,binCode);
|
|
StdLog.IntForm(i,10,3,' ',FALSE);
|
|
StdLog.IntForm(binCode,2,16,' ',TRUE);
|
|
StdLog.IntForm(grayCode,2,16,' ',TRUE);
|
|
StdLog.Ln;
|
|
END
|
|
END Do;
|
|
|
|
END GrayCodes.
|