|
@@ -0,0 +1,64 @@
|
|
|
+program project1;
|
|
|
+
|
|
|
+{$mode objfpc}{$H+}
|
|
|
+
|
|
|
+uses
|
|
|
+ Classes, SysUtils, strutils;
|
|
|
+
|
|
|
+type
|
|
|
+ TPad1 = 0..65535; // 16 bits padding
|
|
|
+ TLevel1 = 0..63; // 6 bits
|
|
|
+ TLevel2 = 0..1023; // 10 bits
|
|
|
+ TLevel3 = 0..16777215; // 24 bits
|
|
|
+ TLevel4 = 0..255; // 8 bits
|
|
|
+
|
|
|
+ TLevelsRec = bitpacked record
|
|
|
+ level4 : TLevel4;
|
|
|
+ level3 : TLevel3;
|
|
|
+ level2 : TLevel2;
|
|
|
+ level1 : TLevel1;
|
|
|
+ pad : TPad1; // padding to make record size 64 bits
|
|
|
+ end;
|
|
|
+
|
|
|
+var
|
|
|
+ id : TLevelsRec;
|
|
|
+begin
|
|
|
+ writeln('record size: ', sizeof(TLevelsRec));
|
|
|
+
|
|
|
+ writeln(StringOfChar('-', 32));
|
|
|
+ FillChar(id, sizeof(id), 0);
|
|
|
+ TLevelsRec(id).level1 := 1;
|
|
|
+ TLevelsRec(id).level2 := 0;
|
|
|
+ TLevelsRec(id).level3 := 3;
|
|
|
+ TLevelsRec(id).level4 := 4;
|
|
|
+ writeln(TLevelsRec(id).level1, ' (', IntToBin(TLevelsRec(id).level1, 8), ')');
|
|
|
+ writeln(TLevelsRec(id).level2, ' (', IntToBin(TLevelsRec(id).level2, 12), ')');
|
|
|
+ writeln(TLevelsRec(id).level3, ' (', IntToBin(TLevelsRec(id).level3, 26), ')');
|
|
|
+ writeln(TLevelsRec(id).level4, ' (', IntToBin(TLevelsRec(id).level4, 10), ')');
|
|
|
+ writeln(IntToBin(int64(id), 64));
|
|
|
+
|
|
|
+ if (TLevelsRec(id).level1 <> 1) then raise Exception.Create('level1 bad');
|
|
|
+ if (TLevelsRec(id).level2 <> 0) then raise Exception.Create('level2 bad');
|
|
|
+ if (TLevelsRec(id).level3 <> 3) then raise Exception.Create('level3 bad');
|
|
|
+ if (TLevelsRec(id).level4 <> 4) then raise Exception.Create('level4 bad');
|
|
|
+
|
|
|
+ writeln(StringOfChar('-', 32));
|
|
|
+ FillChar(id, sizeof(id), 0);
|
|
|
+ TLevelsRec(id).level1 := 1;
|
|
|
+ TLevelsRec(id).level2 := 2;
|
|
|
+ TLevelsRec(id).level3 := 3;
|
|
|
+ TLevelsRec(id).level4 := 4;
|
|
|
+ writeln(TLevelsRec(id).level1, ' (', IntToBin(TLevelsRec(id).level1, 8), ')');
|
|
|
+ writeln(TLevelsRec(id).level2, ' (', IntToBin(TLevelsRec(id).level2, 12), ')');
|
|
|
+ writeln(TLevelsRec(id).level3, ' (', IntToBin(TLevelsRec(id).level3, 26), ')');
|
|
|
+ writeln(TLevelsRec(id).level4, ' (', IntToBin(TLevelsRec(id).level4, 10), ')');
|
|
|
+ writeln(IntToBin(int64(id), 64));
|
|
|
+
|
|
|
+ if (TLevelsRec(id).level1 <> 1) then raise Exception.Create('level1 bad');
|
|
|
+ if (TLevelsRec(id).level2 <> 2) then raise Exception.Create('level2 bad');
|
|
|
+ if (TLevelsRec(id).level3 <> 3) then raise Exception.Create('level3 bad');
|
|
|
+ if (TLevelsRec(id).level4 <> 4) then raise Exception.Create('level4 bad');
|
|
|
+
|
|
|
+end.
|
|
|
+
|
|
|
+
|