bitUtil.lua 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. local root = {data32 = {}}
  2. for i = 1, 32 do
  3. root.data32[i] = 2 ^ (32 - i)
  4. end
  5. -- 数字转2进制
  6. function root:d2b(arg)
  7. local tr = {}
  8. for i = 1, 32 do
  9. if arg >= self.data32[i] then
  10. tr[i] = 1
  11. arg = arg - self.data32[i]
  12. else
  13. tr[i] = 0
  14. end
  15. end
  16. return tr
  17. end
  18. -- 2进制转数字
  19. function root:b2d(arg)
  20. local nr = 0
  21. for i = 1, 32 do
  22. if arg[i] == 1 then
  23. nr = nr + 2 ^ (32 - i)
  24. end
  25. end
  26. return nr
  27. end
  28. function root:_xor(a, b)
  29. local op1 = self:d2b(a)
  30. local op2 = self:d2b(b)
  31. local r = {}
  32. for i = 1, 32 do
  33. if op1[i] == op2[i] then
  34. r[i] = 0
  35. else
  36. r[i] = 1
  37. end
  38. end
  39. return self:b2d(r)
  40. end --root:xor
  41. function root:_and(a, b)
  42. local op1 = self:d2b(a)
  43. local op2 = self:d2b(b)
  44. local r = {}
  45. for i = 1, 32 do
  46. if op1[i] == 1 and op2[i] == 1 then
  47. r[i] = 1
  48. else
  49. r[i] = 0
  50. end
  51. end
  52. return self:b2d(r)
  53. end --root:_and
  54. function root:_or(a, b)
  55. local op1 = self:d2b(a)
  56. local op2 = self:d2b(b)
  57. local r = {}
  58. for i = 1, 32 do
  59. if op1[i] == 1 or op2[i] == 1 then
  60. r[i] = 1
  61. else
  62. r[i] = 0
  63. end
  64. end
  65. return self:b2d(r)
  66. end --root:_or
  67. function root:_not(a)
  68. local op1 = self:d2b(a)
  69. local r = {}
  70. for i = 1, 32 do
  71. if op1[i] == 1 then
  72. r[i] = 0
  73. else
  74. r[i] = 1
  75. end
  76. end
  77. return self:b2d(r)
  78. end --root:_not
  79. function root:_rshift(a, n)
  80. local op1 = self:d2b(a)
  81. local r = self:d2b(0)
  82. if n < 32 and n > 0 then
  83. for i = 1, n do
  84. for i = 31, 1, -1 do
  85. op1[i + 1] = op1[i]
  86. end
  87. op1[1] = 0
  88. end
  89. r = op1
  90. end
  91. return self:b2d(r)
  92. end --root:_rshift
  93. function root:_lshift(a, n)
  94. local op1 = self:d2b(a)
  95. local r = self:d2b(0)
  96. if n < 32 and n > 0 then
  97. for i = 1, n do
  98. for i = 1, 31 do
  99. op1[i] = op1[i + 1]
  100. end
  101. op1[32] = 0
  102. end
  103. r = op1
  104. end
  105. return self:b2d(r)
  106. end --root:_lshift
  107. function root:print(ta)
  108. local sr = ""
  109. for i = 1, 32 do
  110. sr = sr .. ta[i]
  111. end
  112. end
  113. return root