INTERFACEBits ;
Arithmetic for Modula-3, see doc for detailsAbstract: Bits and Bytes
2/17/96 Harry George Initial version
IMPORT Word;Handy collectors
TYPE
NYBBLE = BITS 4 FOR [0 .. 16_F];
BYTE = BITS 8 FOR [0 .. 16_FF];
(* Declare bit arrays (i.e. bit maps) as needed. BitArray = ARRAY
[0..N] OF BITS 1 FOR [0..1]; *)
ByteArray = REF ARRAY OF BYTE;
Which Endian?
TYPE (* e.g., LOOPHOLE(my_cardinal,BigEndian).b1 *) AnyEndian = RECORD data: ARRAY [0 .. 3] OF BYTE; END; BigEndian = RECORD b4, b3, b2, b1: BYTE; END; LittleEndian = RECORD b1, b2, b3, b4: BYTE; END; PROCEDURE WhichEndian (): [-1 .. +1];
-1 means little-endian, +1 means big-endian.
Other Functions
PROCEDURE Fmt (x : Word.T;
nbits: [1 .. Word.Size] := 32;
base : CARDINAL := 2; (* typically 2 or 16 *)
): TEXT;
returns text for x, left padded to nbits length by 0 if necessary.
PROCEDURE Reverse (x : Word.T; (* given this number *)
nbits: [1 .. Word.Size]; (* using the low n bits *)
): Word.T; (* return reversed bit pattern *)
E.g., nbits = 4 ==> 00001011 becomes 00001101 NOTE: There are better ways to do this if you need to do a whole array, as in FFT. See xFFT.m3.
PROCEDURE HashPJW (READONLY str : ARRAY OF CHAR; (* given this string *)
n1, nn: CARDINAL; (* using n1..nn *)
): CARDINAL; (* return hash value *)
P. Weinberger's hash. From the str buffer, using str[n1]..str[nn], make a hash value
PROCEDURE HashELF (READONLY str : ARRAY OF CHAR; (* given this string *)
n1, nn: CARDINAL; (* using n1..nn *)
): CARDINAL; (* return hash value *)
ELF hash From the str buffer, using str[n1]..str[nn], make a hash value
END Bits.