[Back to NUMBERS SWAG index]  [Back to Main SWAG index]  [Original]

{
ROB GREEN

> What if I want to just access a bit?  Say I have a Byte, to store
> Various access levels (if it does/doesn't have this, that, or the
> other).  How can I
> 1)  Access, say, bit 4?
> 2)  Give, say, bit 4, a value of 1?

Heres a Procedure i wrote to handle all that.  if you need speed, then
i suggest to manually check each bit, rather than use the Procedures.

(these Procedures are based on 1, not 0.  thus each Byte is like so:
87654321   instead of 76543210.  to change to 0 base, change the Array to
[0..31] instead of [1..32].)

to set a bit: (b is an Integer Type, BIT is which bit to set
   b:=b or BIT;   ex: b:=b or 128  (set bit 8)

to clear a bit:
   b:=b and not BIT;  ex:b:=b and not 8;  (clears bit 4)

to check a bit:
   if b and BIT<>0 then..  ex:if b and 64 then..  (check bit 7)
}

Const
{ Used to convert the Bit value to the actual corresponding number }
   bit : Array[1..32] of LongInt =
       (1, 2, 4, 8, $10, $20, $40, $80, $100, $200, $400, $800, $1000, $2000,
        $4000, $8000, $10000, $20000, $40000, $80000, $100000, $200000,
        $400000, $800000, $1000000, $2000000, $4000000, $8000000, $10000000,
        $20000000, $40000000, $80000000);

{b is which bit to set(1-32), size is the size of temp.
Use  SIZEOF(TEMP) to get the value, and temp is the actuall Integer based
number
returns True if bit set, False if not}

Function checkbit(b : Byte; size : Byte; Var temp) : Boolean; {1-32}
Var
  c : Boolean;
begin
   c:=False;
   Case size of
     1 : c := Byte(temp) and bit[b] <> 0;     {Byte,shortint}
     2 : c := Word(temp) and bit[b] <> 0;     {Word,Integer}
     4 : c := LongInt(temp) and bit[b] <> 0;  {LongInt}
     else
       Writeln('Invalid size');
   end;
   checkbit := c;
end;

{b,size,and temp same as above.  if onoff =True the bit will be set,
else the bit will be cleared}

Procedure setbit(b : Byte; onoff : Boolean; size : Byte; Var temp); {1-32}
begin
   if onoff then
   Case size of
     1 : Byte(temp) := Byte(temp) or bit[b];        {Byte}
     2 : Word(temp) := Word(temp) or bit[b];        {Word}
     4 : LongInt(temp) := LongInt(Temp) or bit[b];  {LongInt}
     else
       Writeln('Invalid size');
   end
   else
   Case size of
     1 : Byte(temp) := Byte(temp) and not bit[b];   {Byte}
     2 : Word(temp) := Word(temp) and not bit[b];   {Word}
     4 : LongInt(temp) := LongInt(Temp) and not bit[b];{LongInt}
     else
       Writeln('Invalid size');
   end;
end;

{this is a sample test Program i wrote For you to see how to use the
stuff above}

Var
  i : LongInt;
  j : Byte;
begin
   i := 0;
   setbit(4,True,sizeof(i),i);  {8}
   Writeln(i);
   setbit(9,True,sizeof(i),i);  {256+8 = 264}
   Writeln(i);
   setbit(9,False,sizeof(i),i); {8}
   Writeln(i);
   setbit(20,True,sizeof(i),i); { $80000+8 = $80008}
   Writeln(i);
   For i := 65550 to 65575 do
   begin
     Write(i : 8, ' = ');
     For j := 32 downto 1 do {to print right}
       if checkbit(j, sizeof(i), i) then
         Write('1')
       else
         Write('0');
     Writeln;
   end;
end.

[Back to NUMBERS SWAG index]  [Back to Main SWAG index]  [Original]