103 lines
3.5 KiB
Plaintext
103 lines
3.5 KiB
Plaintext
BEGIN
|
|
COMMENT TO MY KNOWLEDGE SIMULA DOES NOT SUPPORT BITWISE OPERATIONS SO WE MUST WRITE PROCEDURES FOR THE JOB ;
|
|
INTEGER WORDSIZE;
|
|
WORDSIZE := 32;
|
|
BEGIN
|
|
|
|
PROCEDURE TOBITS(N,B); INTEGER N; BOOLEAN ARRAY B;
|
|
BEGIN
|
|
INTEGER I,BITN;
|
|
FOR I := WORDSIZE-1 STEP -1 UNTIL 0 DO BEGIN
|
|
BITN := MOD(N,2); B(I) := BITN<>0; N := N // 2;
|
|
END;
|
|
END TOBITS;
|
|
|
|
INTEGER PROCEDURE FROMBITS(B); BOOLEAN ARRAY B;
|
|
BEGIN
|
|
INTEGER I, RESULT;
|
|
FOR I := 0 STEP 1 UNTIL WORDSIZE-1 DO
|
|
RESULT := 2 * RESULT + (IF B(I) THEN 1 ELSE 0);
|
|
FROMBITS := RESULT;
|
|
END FROMBITS;
|
|
|
|
INTEGER PROCEDURE BITOP(A,B,F);
|
|
INTEGER A,B;
|
|
PROCEDURE F IS BOOLEAN PROCEDURE F(A,B); BOOLEAN A,B;;
|
|
BEGIN
|
|
INTEGER I;
|
|
BOOLEAN ARRAY BA(0:WORDSIZE-1);
|
|
BOOLEAN ARRAY BB(0:WORDSIZE-1);
|
|
TOBITS(A,BA);
|
|
TOBITS(B,BB);
|
|
FOR I := 0 STEP 1 UNTIL WORDSIZE-1 DO BA(I) := F(BA(I),BB(I));
|
|
BITOP := FROMBITS(BA);
|
|
END BITOP;
|
|
|
|
INTEGER PROCEDURE BITUOP(A,F);
|
|
INTEGER A;
|
|
PROCEDURE F IS BOOLEAN PROCEDURE F(A); BOOLEAN A;;
|
|
BEGIN
|
|
INTEGER I;
|
|
BOOLEAN ARRAY BA(0:WORDSIZE-1);
|
|
TOBITS(A,BA);
|
|
FOR I := 0 STEP 1 UNTIL WORDSIZE-1 DO BA(I) := F(BA(I));
|
|
BITUOP := FROMBITS(BA);
|
|
END BITUOP;
|
|
|
|
BOOLEAN PROCEDURE OPAND(A,B); BOOLEAN A,B; OPAND := A AND B;
|
|
INTEGER PROCEDURE BITAND(A,B); INTEGER A,B; BITAND := BITOP(A,B,OPAND);
|
|
|
|
BOOLEAN PROCEDURE OPOR(A,B); BOOLEAN A,B; OPOR := A OR B;
|
|
INTEGER PROCEDURE BITOR(A,B); INTEGER A,B; BITOR := BITOP(A,B,OPOR);
|
|
|
|
BOOLEAN PROCEDURE OPXOR(A,B); BOOLEAN A,B; OPXOR := (A AND NOT B) OR (NOT A AND B);
|
|
INTEGER PROCEDURE BITXOR(A,B); INTEGER A,B; BITXOR := BITOP(A,B,OPXOR);
|
|
|
|
BOOLEAN PROCEDURE OPNOT(A); BOOLEAN A; OPNOT := NOT A;
|
|
INTEGER PROCEDURE BITNOT(A); INTEGER A; BITNOT := BITUOP(A,OPNOT);
|
|
|
|
INTEGER PROCEDURE BITSHL(A,B); INTEGER A,B;
|
|
BEGIN
|
|
IF B < 0 THEN A := BITSHR(A,-B)
|
|
ELSE WHILE B > 0 DO BEGIN A := 2 * A; B := B-1; END;
|
|
BITSHL := A;
|
|
END BITSHL;
|
|
|
|
INTEGER PROCEDURE BITSHR(A,B); INTEGER A,B;
|
|
BEGIN
|
|
IF B < 0 THEN A := BITSHL(A,-B)
|
|
ELSE WHILE B > 0 DO BEGIN A := A // 2; B := B-1; END;
|
|
BITSHR := A;
|
|
END BITSHR;
|
|
|
|
INTEGER PROCEDURE BITROTR(A,B); INTEGER A,B;
|
|
BEGIN
|
|
INTEGER I,J;
|
|
BOOLEAN ARRAY BA(0:WORDSIZE-1);
|
|
BOOLEAN ARRAY BB(0:WORDSIZE-1);
|
|
TOBITS(A,BA);
|
|
FOR I := 0 STEP 1 UNTIL WORDSIZE-1 DO BEGIN
|
|
J := MOD(I + B, WORDSIZE); BB(J) := BA(I);
|
|
END;
|
|
BITROTR := FROMBITS(BB);
|
|
END BITROTR;
|
|
|
|
INTEGER PROCEDURE BITROTL(A,B); INTEGER A,B;
|
|
BITROTL := BITROTR(A,-B);
|
|
|
|
PROCEDURE BITWISE(A,B); INTEGER A,B;
|
|
BEGIN
|
|
OUTTEXT("A AND B : "); OUTINT(BITAND(A,B),0); OUTIMAGE;
|
|
OUTTEXT("A OR B : "); OUTINT(BITOR (A,B),0); OUTIMAGE;
|
|
OUTTEXT("A XOR B : "); OUTINT(BITXOR(A,B),0); OUTIMAGE;
|
|
OUTTEXT("NOT A : "); OUTINT(BITNOT(A), 0); OUTIMAGE;
|
|
OUTTEXT("A << B : "); OUTINT(BITSHL(A,B),0); OUTIMAGE; ! LEFT SHIFT ;
|
|
OUTTEXT("A >> B : "); OUTINT(BITSHR(A,B),0); OUTIMAGE; ! ARITHMETIC RIGHT SHIFT ;
|
|
OUTTEXT("A ROTL B : "); OUTINT(BITROTL(A,B),0); OUTIMAGE; ! ROTATE LEFT ;
|
|
OUTTEXT("A ROTR B : "); OUTINT(BITROTR(A,B),0); OUTIMAGE; ! ROTATE RIGHT ;
|
|
END BITWISE;
|
|
|
|
BITWISE(14,3);
|
|
END;
|
|
END
|