Home page > Delphi, tips bulk > Tips for beginners > FlagFunctions: manipulate bits in Cardinals

FlagFunctions: manipulate bits in Cardinals

Friday 26 August 2011, by CapJack

This Delphi unit shows how to work on the bits of an integer variable, which can store several flags in one variable.

The Windows API uses a lot this way to pass parameters.

Note however that the Pascal language can do the same thing more elegantly with the types "set".

  1. (*********************************************************)
  2. (***)                                                 (***)
  3. (***)             UNIT FlagFunctions;                 (***)
  4. (***)                                                 (***)
  5. (*********************************************************)
  6.  
  7. (*********************************************************)
  8. (* Feel free to use it, but at your own risk!            *)
  9. (* À utiliser librement, mais à vos risques et périls !  *)
  10. (* CapJack - http://capjack.fr                           *)
  11. (*********************************************************)
  12.  
  13.  
  14. (*********************************************************)
  15. (***)                                                 (***)
  16. (***)                  INTERFACE                      (***)
  17. (***)                                                 (***)
  18. (*********************************************************)
  19.  
  20.  
  21. (*********************************************************)
  22. (* DTSetMask, DTOneBitSet, DTAllBitsSet, DTBitIsSet      *)
  23. (* ------------------------------------------------------*)
  24. (* Set of tools to manipulate bits in Cardinals.         *)
  25. (* ------------------------------------------------------*)
  26. (* Jeu d'outils pour manipuler les bits des Cardinaux. ;)*)
  27. (*********************************************************)
  28.  
  29. const DTMask : array [0..31] of Cardinal = (
  30.       $00000001,$00000002,$00000004,$00000008,
  31.       $00000010,$00000020,$00000040,$00000080,
  32.       $00000100,$00000200,$00000400,$00000800,
  33.       $00001000,$00002000,$00004000,$00008000,
  34.       $00010000,$00020000,$00040000,$00080000,
  35.       $00100000,$00200000,$00400000,$00800000,
  36.       $01000000,$02000000,$04000000,$08000000,
  37.       $10000000,$20000000,$40000000,$80000000);
  38.  
  39. {
  40.  Sets to 1 (if AFlag = true), or to 0 (if AFlag = false)
  41.  the bit(s) of AValue designated by AMask.
  42.  Positionne à 1 (si AFlag = true) ou à 0 (si AFlag = false)
  43.  le(s) bit(s) de AValue désignés par AMask.
  44. }
  45. Procedure DTSetMask ( var   AValue, AMask : Cardinal;
  46.                       const AFlag         : Boolean );
  47.  
  48.  
  49. {
  50.  Returns true if ONE of the bits of AValue designated
  51.  by AMask is set to 1.
  52.  Renvoie true si l'UN des bits de Value désignés
  53.  par AMask est positionné à 1.
  54. }
  55. Function  DTOneBitSet( const AValue, AMask: Cardinal ): Boolean;
  56.  
  57.  
  58. {
  59.  Returns true if ALL the bits of AValue designated
  60.  by AMask are set to 1.
  61.  Renvoie true si TOUS les bits de Value désignés
  62.  par AMask sont positionnés à 1.
  63. }
  64. Function  DTAllBitsSet(const AValue,AMask: Cardinal):boolean;
  65.  
  66.  
  67. {
  68.  Returns true if the bit n° ANumbit of AValue is set to 1.
  69.  Renvoie true si le bit n° ANumBit de AValue vaut 1.
  70. }
  71. Function  DTBitIsSet(const ANumBit, AValue : Cardinal): Boolean;
  72.  
  73.  
  74. (*********************************************************)
  75. (***)                                                 (***)
  76. (***)                IMPLEMENTATION                   (***)
  77. (***)                                                 (***)
  78. (*********************************************************)
  79.  
  80. {---------------------------------------------------------}
  81.  
  82. Procedure DTSetMask ( var   AValue, AMask : Cardinal;
  83.                       const AFlag         : Boolean );
  84.  begin
  85.   if AFlag
  86.      then AValue := AValue or AMask
  87.      else AValue := AValue and not(AMask);
  88.  end;
  89.  
  90. {---------------------------------------------------------}
  91.  
  92. Function  DTOneBitSet( const AValue, AMask: Cardinal ): Boolean;
  93.  begin
  94.   Result := ( ( AValue and AMask ) <> 0 )
  95.  end;
  96.  
  97. {---------------------------------------------------------}
  98.  
  99. Function  DTAllBitsSet( const AValue, AMask: Cardinal ): Boolean;
  100.  begin
  101.   Result := ( ( AValue and AMask) = AMask )
  102.  end;
  103.  
  104. {---------------------------------------------------------}
  105.  
  106. Function  DTBitIsSet( const ANumBit, AValue: Cardinal ): Boolean;
  107.  begin
  108.   Result := ( AValue and DTMask[ANumBit] ) <> 0;
  109.  end;
  110.  
  111. {---------------------------------------------------------}
  112.  
  113. END.