fork download
  1. type
  2. bitnum = 0..63;
  3. set64 = set of bitnum;
  4.  
  5. function BT(x: uint64; n: bitnum): boolean;
  6. var
  7. tempset: set64 absolute x;
  8. begin
  9. BT := n in tempset
  10. end;
  11.  
  12. function BTS(var x: uint64; n: bitnum): boolean;
  13. var
  14. tempset: set64 absolute x;
  15. begin
  16. BTS := n in tempset;
  17. tempset := tempset + [1 shl n]
  18. end;
  19.  
  20. function BTR(var x: uint64; n: bitnum): boolean;
  21. var
  22. tempset: set64 absolute x;
  23. begin
  24. BTR := n in tempset;
  25. tempset := tempset - [1 shl n]
  26. end;
  27.  
  28. function BTC(var x: uint64; n: bitnum): boolean;
  29. var
  30. tempset: set64 absolute x;
  31. begin
  32. BTC := n in tempset;
  33. tempset := tempset >< [1 shl n]
  34. end;
  35.  
  36. function BSR(x: uint64): bitnum;
  37. var
  38. tempset: set64 absolute x;
  39. i: bitnum;
  40. begin
  41. for i in tempset do
  42. begin
  43. BSR := i;
  44. break;
  45. end;
  46. end;
  47.  
  48. function BSF(x: uint64): bitnum;
  49. var
  50. tempset: set64 absolute x;
  51. i: bitnum;
  52. begin
  53. for i in tempset do
  54. begin
  55. BSF := i;
  56. end;
  57. end;
  58.  
  59. begin
  60.  
  61. Writeln('Bit N ', 3, ' in ', 10, ' is ', BT(10, 3));
  62. Writeln('Bit N ', 3, ' in ', 7, ' is ', BT(7, 3));
  63.  
  64. Writeln('Lowest bit in ', 12, ' is ', BSR(12));
  65. Writeln('Lowest bit in ', 7, ' is ', BSR(7));
  66. Writeln('Highest bit in ', 12, ' is ', BSF(12));
  67. Writeln('Highest bit in ', 7, ' is ', BSF(7));
  68. end.
  69.  
Success #stdin #stdout 0s 336KB
stdin
Standard input is empty
stdout
Bit N 3 in 10 is TRUE
Bit N 3 in 7 is FALSE
Lowest bit in 12 is 2
Lowest bit in 7 is 0
Highest bit in 12 is 3
Highest bit in 7 is 2