{ 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.