1program project1;
2
3{$mode objfpc}{$H+}
4
5uses
6  Classes, SysUtils, strutils;
7
8type
9  TPad1   = 0..65535;    // 16 bits padding
10  TLevel1 = 0..63;       // 6 bits
11  TLevel2 = 0..1023;     // 10 bits
12  TLevel3 = 0..16777215; // 24 bits
13  TLevel4 = 0..255;      // 8 bits
14
15  TLevelsRec = bitpacked record
16    level4  : TLevel4;
17    level3  : TLevel3;
18    level2  : TLevel2;
19    level1  : TLevel1;
20    pad     : TPad1;     // padding to make record size 64 bits
21  end;
22
23var
24  id : TLevelsRec;
25begin
26  writeln('record size: ', sizeof(TLevelsRec));
27
28  writeln(StringOfChar('-', 32));
29  FillChar(id, sizeof(id), 0);
30  TLevelsRec(id).level1 := 1;
31  TLevelsRec(id).level2 := 0;
32  TLevelsRec(id).level3 := 3;
33  TLevelsRec(id).level4 := 4;
34  writeln(TLevelsRec(id).level1, ' (', IntToBin(TLevelsRec(id).level1, 8), ')');
35  writeln(TLevelsRec(id).level2, ' (', IntToBin(TLevelsRec(id).level2, 12), ')');
36  writeln(TLevelsRec(id).level3, ' (', IntToBin(TLevelsRec(id).level3, 26), ')');
37  writeln(TLevelsRec(id).level4, ' (', IntToBin(TLevelsRec(id).level4, 10), ')');
38  writeln(IntToBin(int64(id), 64));
39
40  if (TLevelsRec(id).level1 <> 1) then raise Exception.Create('level1 bad');
41  if (TLevelsRec(id).level2 <> 0) then raise Exception.Create('level2 bad');
42  if (TLevelsRec(id).level3 <> 3) then raise Exception.Create('level3 bad');
43  if IntToBin(TLevelsRec(id).level3, 26)<> '00000000000000000000000011' then
44    raise Exception.Create('level3 bad in IntToBin call');
45  if (TLevelsRec(id).level4 <> 4) then raise Exception.Create('level4 bad');
46
47  writeln(StringOfChar('-', 32));
48  FillChar(id, sizeof(id), 0);
49  TLevelsRec(id).level1 := 1;
50  TLevelsRec(id).level2 := 2;
51  TLevelsRec(id).level3 := 3;
52  TLevelsRec(id).level4 := 4;
53  writeln(TLevelsRec(id).level1, ' (', IntToBin(TLevelsRec(id).level1, 8), ')');
54  writeln(TLevelsRec(id).level2, ' (', IntToBin(TLevelsRec(id).level2, 12), ')');
55  writeln(TLevelsRec(id).level3, ' (', IntToBin(TLevelsRec(id).level3, 26), ')');
56  writeln(TLevelsRec(id).level4, ' (', IntToBin(TLevelsRec(id).level4, 10), ')');
57  writeln(IntToBin(int64(id), 64));
58
59  if (TLevelsRec(id).level1 <> 1) then raise Exception.Create('level1 bad');
60  if (TLevelsRec(id).level2 <> 2) then raise Exception.Create('level2 bad');
61  if (TLevelsRec(id).level3 <> 3) then raise Exception.Create('level3 bad');
62  if IntToBin(TLevelsRec(id).level3, 26)<> '00000000000000000000000011' then
63    raise Exception.Create('level3 bad in IntToBin call');
64  if (TLevelsRec(id).level4 <> 4) then raise Exception.Create('level4 bad');
65
66end.
67
68
69