bitwise.lua 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. print("testing bitwise operations")
  2. assert(bit32.band() == bit32.bnot(0))
  3. assert(bit32.btest() == true)
  4. assert(bit32.bor() == 0)
  5. assert(bit32.bxor() == 0)
  6. assert(bit32.band() == bit32.band(0xffffffff))
  7. assert(bit32.band(1,2) == 0)
  8. -- out-of-range numbers
  9. assert(bit32.band(-1) == 0xffffffff)
  10. assert(bit32.band(2^33 - 1) == 0xffffffff)
  11. assert(bit32.band(-2^33 - 1) == 0xffffffff)
  12. assert(bit32.band(2^33 + 1) == 1)
  13. assert(bit32.band(-2^33 + 1) == 1)
  14. assert(bit32.band(-2^40) == 0)
  15. assert(bit32.band(2^40) == 0)
  16. assert(bit32.band(-2^40 - 2) == 0xfffffffe)
  17. assert(bit32.band(2^40 - 4) == 0xfffffffc)
  18. assert(bit32.lrotate(0, -1) == 0)
  19. assert(bit32.lrotate(0, 7) == 0)
  20. assert(bit32.lrotate(0x12345678, 4) == 0x23456781)
  21. assert(bit32.rrotate(0x12345678, -4) == 0x23456781)
  22. assert(bit32.lrotate(0x12345678, -8) == 0x78123456)
  23. assert(bit32.rrotate(0x12345678, 8) == 0x78123456)
  24. assert(bit32.lrotate(0xaaaaaaaa, 2) == 0xaaaaaaaa)
  25. assert(bit32.lrotate(0xaaaaaaaa, -2) == 0xaaaaaaaa)
  26. for i = -50, 50 do
  27. assert(bit32.lrotate(0x89abcdef, i) == bit32.lrotate(0x89abcdef, i%32))
  28. end
  29. assert(bit32.lshift(0x12345678, 4) == 0x23456780)
  30. assert(bit32.lshift(0x12345678, 8) == 0x34567800)
  31. assert(bit32.lshift(0x12345678, -4) == 0x01234567)
  32. assert(bit32.lshift(0x12345678, -8) == 0x00123456)
  33. assert(bit32.lshift(0x12345678, 32) == 0)
  34. assert(bit32.lshift(0x12345678, -32) == 0)
  35. assert(bit32.rshift(0x12345678, 4) == 0x01234567)
  36. assert(bit32.rshift(0x12345678, 8) == 0x00123456)
  37. assert(bit32.rshift(0x12345678, 32) == 0)
  38. assert(bit32.rshift(0x12345678, -32) == 0)
  39. assert(bit32.arshift(0x12345678, 0) == 0x12345678)
  40. assert(bit32.arshift(0x12345678, 1) == 0x12345678 / 2)
  41. assert(bit32.arshift(0x12345678, -1) == 0x12345678 * 2)
  42. assert(bit32.arshift(-1, 1) == 0xffffffff)
  43. assert(bit32.arshift(-1, 24) == 0xffffffff)
  44. assert(bit32.arshift(-1, 32) == 0xffffffff)
  45. -- assert(bit32.arshift(-1, -1) == (-1 * 2) % 2^32)
  46. print("+")
  47. -- some special cases
  48. local c = {0, 1, 2, 3, 10, 0x80000000, 0xaaaaaaaa, 0x55555555,
  49. 0xffffffff, 0x7fffffff}
  50. for _, b in pairs(c) do
  51. assert(bit32.band(b) == b)
  52. assert(bit32.band(b, b) == b)
  53. assert(bit32.btest(b, b) == (b ~= 0))
  54. assert(bit32.band(b, b, b) == b)
  55. assert(bit32.btest(b, b, b) == (b ~= 0))
  56. assert(bit32.band(b, bit32.bnot(b)) == 0)
  57. assert(bit32.bor(b, bit32.bnot(b)) == bit32.bnot(0))
  58. assert(bit32.bor(b) == b)
  59. assert(bit32.bor(b, b) == b)
  60. assert(bit32.bor(b, b, b) == b)
  61. assert(bit32.bxor(b) == b)
  62. assert(bit32.bxor(b, b) == 0)
  63. assert(bit32.bxor(b, 0) == b)
  64. assert(bit32.bnot(b) ~= b)
  65. assert(bit32.bnot(bit32.bnot(b)) == b)
  66. assert(bit32.bnot(b) == 2^32 - 1 - b)
  67. assert(bit32.lrotate(b, 32) == b)
  68. assert(bit32.rrotate(b, 32) == b)
  69. assert(bit32.lshift(bit32.lshift(b, -4), 4) == bit32.band(b, bit32.bnot(0xf)))
  70. assert(bit32.rshift(bit32.rshift(b, 4), -4) == bit32.band(b, bit32.bnot(0xf)))
  71. for i = -40, 40 do
  72. assert(bit32.lshift(b, i) == math.floor((b * 2^i) % 2^32))
  73. end
  74. end
  75. assert(not pcall(bit32.band, {}))
  76. assert(not pcall(bit32.bnot, "a"))
  77. assert(not pcall(bit32.lshift, 45))
  78. assert(not pcall(bit32.lshift, 45, print))
  79. assert(not pcall(bit32.rshift, 45, print))
  80. print("+")
  81. -- testing extract/replace
  82. assert(bit32.extract(0x12345678, 0, 4) == 8)
  83. assert(bit32.extract(0x12345678, 4, 4) == 7)
  84. assert(bit32.extract(0xa0001111, 28, 4) == 0xa)
  85. assert(bit32.extract(0xa0001111, 31, 1) == 1)
  86. assert(bit32.extract(0x50000111, 31, 1) == 0)
  87. assert(bit32.extract(0xf2345679, 0, 32) == 0xf2345679)
  88. assert(not pcall(bit32.extract, 0, -1))
  89. assert(not pcall(bit32.extract, 0, 32))
  90. assert(not pcall(bit32.extract, 0, 0, 33))
  91. assert(not pcall(bit32.extract, 0, 31, 2))
  92. assert(bit32.replace(0x12345678, 5, 28, 4) == 0x52345678)
  93. assert(bit32.replace(0x12345678, 0x87654321, 0, 32) == 0x87654321)
  94. assert(bit32.replace(0, 1, 2) == 2^2)
  95. assert(bit32.replace(0, -1, 4) == 2^4)
  96. assert(bit32.replace(-1, 0, 31) == 2^31 - 1)
  97. assert(bit32.replace(-1, 0, 1, 2) == 2^32 - 7)
  98. print'OK'