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