tinttobin.pp 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. {$mode objfpc}
  2. {$h+}
  3. {$hints on}
  4. {$warnings on}
  5. uses
  6. StrUtils;
  7. var
  8. exitCode: integer = 0;
  9. procedure IntToBinTest(const testinteger: integer;
  10. const digits: integer;
  11. const expectation: string;
  12. const testnr: integer);
  13. var
  14. teststring: string;
  15. begin
  16. teststring := IntToBin(testinteger, digits);
  17. if teststring <> expectation then
  18. begin
  19. writeln('Testing strUtils/IntToBin: Test ', testnr, ' failed with number ', testinteger);
  20. writeln('Returned String: ', teststring);
  21. writeln('Expected String: ', expectation);
  22. exitCode := 1;
  23. end;
  24. end;
  25. const
  26. codes: array[0..1] of char = ('0','1');
  27. var
  28. i, j, value: integer;
  29. testinteger: integer;
  30. teststring: string;
  31. digits: integer;
  32. begin
  33. digits := 32;
  34. setlength(teststring, digits);
  35. for testinteger := 0 to $7FFF do
  36. begin
  37. value := testinteger;
  38. for j := digits downto 1 do
  39. begin
  40. teststring[j] := codes[value mod 2];
  41. value := value div 2;
  42. end;
  43. IntToBinTest(testinteger, digits, teststring, 1 + testinteger);
  44. end;
  45. for testinteger := -$8000 to -$1 do
  46. begin
  47. value := -testinteger - 1; { prepare for 2's complement -1 }
  48. teststring[1] := '1'; { sign bit }
  49. teststring[digits] := codes[1 - (value mod 2)]; { inversion of 0 and 1}
  50. value := value div 2;
  51. for j := digits - 1 downto 2 do
  52. begin
  53. teststring[j] := codes[-(value mod 2) + 1];
  54. value := value div 2;
  55. end;
  56. IntToBinTest(testinteger, digits, teststring, $10000 + testinteger);
  57. end;
  58. {$IF DECLARED(longint)}
  59. randomize;
  60. for i := 1 to 1000 do
  61. begin
  62. testinteger := $7FFF + random($80000000 - $7FFF);
  63. value := testinteger;
  64. for j := digits downto 1 do
  65. begin
  66. teststring[j] := codes[value mod 2];
  67. value := value div 2;
  68. end;
  69. IntToBinTest(testinteger, digits, teststring, $10000 + i);
  70. end;
  71. for i := 1 to 1000 do
  72. begin
  73. testinteger := -$8000 - random($80000000 - $8000);
  74. value := -testinteger - 1; { prepare for 2's complement -1 }
  75. teststring[1] := '1'; { sign bit }
  76. teststring[digits] := codes[1 - (value mod 2)]; { inversion of 0 and 1}
  77. value := value div 2;
  78. for j := digits - 1 downto 2 do
  79. begin
  80. teststring[j] := codes[-(value mod 2) + 1];
  81. value := value div 2;
  82. end;
  83. IntToBinTest(testinteger, digits, teststring, $10000 + 1000 + i);
  84. end;
  85. {$IFEND}
  86. halt(exitCode);
  87. end.