home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / magazine / drdobbs / 1990 / 03 / dunteman.lst < prev    next >
File List  |  1990-02-13  |  4KB  |  158 lines

  1.  
  2.  
  3. STRUCTURED PROGRAMMING COLUMN
  4. by Jeff Duntemann
  5.  
  6.  
  7.  
  8.  
  9.  
  10. [LISTING ONE]
  11.  
  12. (*---------------------------------------------------*)
  13. (*                  BITWISE.MOD                 *)
  14. (*               Definition Module                   *)
  15. (*                                                   *)
  16. (*     Bit-manipulation routines for Modula-2        *)
  17. (*                                                   *)
  18. (*                            by Jeff Duntemann      *)
  19. (*                            For DDJ : March 1990   *)
  20. (*                            Last modified 11/25/89 *)
  21. (*---------------------------------------------------*)
  22.  
  23.  
  24. DEFINITION MODULE Bitwise;
  25.  
  26. PROCEDURE And(A,B : CARDINAL) : CARDINAL;
  27.  
  28. PROCEDURE Or(A,B : CARDINAL) : CARDINAL;
  29.  
  30. PROCEDURE Xor(A,B : CARDINAL) : CARDINAL;
  31.  
  32. PROCEDURE Not(Target : CARDINAL) : CARDINAL;
  33.  
  34. PROCEDURE SetBit(Target : CARDINAL; BitNum : CARDINAL) : CARDINAL;
  35.  
  36. PROCEDURE ClearBit(Target : CARDINAL; BitNum : CARDINAL) : CARDINAL;
  37.  
  38. PROCEDURE TestBit(Target : CARDINAL; BitNum : CARDINAL) : BOOLEAN;
  39.  
  40. PROCEDURE SHR(Target : CARDINAL; By : CARDINAL) : CARDINAL;
  41.  
  42. PROCEDURE SHL(Target : CARDINAL; By : CARDINAL) : CARDINAL;
  43.  
  44. END Bitwise.
  45.  
  46.  
  47.  
  48. [LISTING TWO]
  49.  
  50. (*---------------------------------------------------*)
  51. (*                  BITWISE.MOD                 *)
  52. (*             Implementation Module                 *)
  53. (*                                                   *)
  54. (*     Bit-manipulation routines for Modula-2        *)
  55. (*                                                   *)
  56. (*                            by Jeff Duntemann      *)
  57. (*                            For DDJ : March 1990   *)
  58. (*                            Last modified 11/25/89 *)
  59. (*                                                   *)
  60. (*  NOTES ON THE CODE:                               *)
  61. (*                                                   *)
  62. (*  In all cases below, BitNum MOD 16 is used as a   *)
  63. (* means of ensuring that BitNum will be in the      *)
  64. (* range of 0..15.  MOD 16 divides by 16 but returns *)
  65. (* the remainder, which cannot be over 15 when you   *)
  66. (* divide by 16.                                     *)
  67. (*---------------------------------------------------*)
  68.  
  69. IMPLEMENTATION MODULE Bitwise;
  70.  
  71. VAR
  72.   I       : CARDINAL;
  73.   TempSet : BITSET;
  74.  
  75.  
  76. PROCEDURE And(A,B : CARDINAL) : CARDINAL;
  77.  
  78. BEGIN
  79.   RETURN CARDINAL(BITSET(A) * BITSET(B));
  80. END And;
  81.  
  82.  
  83. PROCEDURE Or(A,B : CARDINAL) : CARDINAL;
  84.  
  85. BEGIN
  86.   RETURN CARDINAL(BITSET(A) + BITSET(B));
  87. END Or;
  88.  
  89.  
  90. PROCEDURE Xor(A,B : CARDINAL) : CARDINAL;
  91.  
  92. BEGIN
  93.   RETURN CARDINAL(BITSET(A) / BITSET(B));
  94. END Xor;
  95.  
  96.  
  97. PROCEDURE Not(Target : CARDINAL) : CARDINAL;
  98.  
  99. BEGIN
  100.   RETURN CARDINAL({0..15} - BITSET(Target));
  101. END Not;
  102.  
  103.  
  104. PROCEDURE SetBit(Target : CARDINAL; BitNum : CARDINAL) : CARDINAL;
  105.  
  106. BEGIN
  107.   TempSet := BITSET(Target);  (* INCL does not operate on expressions! *)
  108.   INCL(TempSet,BitNum MOD 16);
  109.   RETURN CARDINAL(TempSet);   (* Cast the target back to type CARDINAL *)
  110. END SetBit;
  111.  
  112.  
  113. PROCEDURE ClearBit(Target : CARDINAL; BitNum : CARDINAL) : CARDINAL;
  114.  
  115. BEGIN
  116.   TempSet := BITSET(Target);  (* EXCL does not operate on expressions! *)
  117.   EXCL(TempSet,BitNum MOD 16);
  118.   RETURN CARDINAL(TempSet);   (* Cast the target back to type CARDINAL *)
  119. END ClearBit;
  120.  
  121.  
  122. PROCEDURE TestBit(Target : CARDINAL; BitNum : CARDINAL) : BOOLEAN;
  123.  
  124. BEGIN
  125.   IF (BitNum MOD 16) IN BITSET(Target) THEN
  126.     RETURN TRUE;
  127.   ELSE
  128.     RETURN FALSE;  
  129.   END;  
  130. END TestBit;
  131.  
  132.  
  133. PROCEDURE SHR(Target : CARDINAL; By : CARDINAL) : CARDINAL;
  134.  
  135. BEGIN
  136.   FOR I := 1 TO By DO
  137.     Target := Target DIV 2;
  138.   END;
  139.   RETURN Target;
  140. END SHR;
  141.  
  142.  
  143. PROCEDURE SHL(Target : CARDINAL; By : CARDINAL) : CARDINAL;
  144.  
  145. BEGIN
  146.   FOR I := 1 TO By DO
  147.     Target := Target * 2;
  148.   END;  
  149.   RETURN Target;
  150. END SHL;
  151.  
  152.  
  153. END Bitwise.
  154.  
  155.  
  156.  
  157.  
  158.