[Back to NUMBERS SWAG index] [Back to Main SWAG index] [Original]
{
CHRIS QUARTETTI
>Is there an easy way to create a 1-bit or 2-bit data structure. For
>example, a 2-bit Type that can hold 4 possible values. For that matter,
>is there a hard way? <g> Thanks very much -Greg
I suppose this would qualify For the hard way-- not too flexible, but it
works. It would be a bit easier to do this if you wanted a bunch of the same
size Variables (ie 4 4 bit Variables, or an Array of 4*x 4 bit Variables).
FWIW I used BP7 here, but TP6 and up will work. Also, it need not be Object
oriented.
}
Type
bitf = Object { split 'bits' into bitfields }
bits : Word; { 16 bits total }
Function get : Word;
Procedure set1(value : Word); { this will be 2 bits }
Function get1 : Word;
Procedure set2(value : Word); { this will be 13 bits }
Function get2 : Word;
Procedure set3(value : Word); { this will be 1 bit }
Function get3 : Word;
end;
Function bitf.get : Word;
begin
get := bits;
end;
Procedure bitf.set1(value : Word);
{ Set the value of the first bitfield }
Const
valmask : Word = $C000; { 11000000 00000000 }
bitsmask : Word = $3FFF; { 00111111 11111111 }
begin
value := value shl 14 and valmask;
bits := value + (bits and bitsmask);
end;
Function bitf.get1 : Word;
{ Get the value of the first bitfield }
begin
get1 := bits shr 14;
end;
Procedure bitf.set2(value : Word);
{ Set the value of the second bitfield }
Const
valmask : Word = $3FFE; { 00111111 11111110 }
bitsmask : Word = $C001; { 11000000 00000001 }
begin
value := (value shl 1) and valmask;
bits := value + (bits and bitsmask);
end;
Function bitf.get2 : Word;
{ Get the value of the second bitfield }
Const
valmask : Word = $3FFE; { 00111111 11111110 }
begin
get2 := (bits and valmask) shr 1;
end;
Procedure bitf.set3(value : Word);
{ Set the value of the third bitfield }
Const
valmask : Word = $0001; { 00000000 00000001 }
bitsmask : Word = $FFFE; { 11111111 11111110 }
begin
value := value and valmask;
bits := value + (bits and bitsmask);
end;
Function bitf.get3 : Word;
{ Get the value of the third bitfield }
Const
valmask : Word = $0001; { 00000000 00000001 }
begin
get3 := bits and valmask;
end;
Var
x : bitf;
begin
x.set1(3); { set all to maximum values }
x.set2(8191);
x.set3(1);
Writeln(x.get1, ', ', x.get2, ', ', x.get3, ', ', x.get);
end.
[Back to NUMBERS SWAG index] [Back to Main SWAG index] [Original]