在go中使用lua示例, 基于gopher-lua!
您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

136 行
2.4 KiB

4 年前
  1. require ("math")
  2. module('bit', package.seeall) -- 实现按位运算
  3. --默认按32位
  4. local __bitNum = 32
  5. --设置位数
  6. function setBitNum(bitNum)
  7. __bitNum = bitNum
  8. end
  9. --按位同或
  10. function bxnor(int1, int2)
  11. return __operaByBit(__bitxnor, int1, int2)
  12. end
  13. --按位异或
  14. function bxor(int1, int2)
  15. return __operaByBit(__bitxor, int1, int2)
  16. end
  17. --按位与
  18. function band(int1, int2)
  19. return __operaByBit(__bitand, int1, int2)
  20. end
  21. --按位或
  22. function bor(int1, int2)
  23. return __operaByBit(__bitor, int1, int2)
  24. end
  25. --按位非
  26. function bnot(integer)
  27. return __operaByBit(__bitnot, integer)
  28. end
  29. --按位操作
  30. function __operaByBit(bitFunc, ...)
  31. local bDataLst = {}
  32. for i = 1, select("#", ...) do
  33. local bData = itob(select(i, ...))
  34. table.insert(bDataLst, bData)
  35. end
  36. for _, bData in ipairs(bDataLst) do
  37. for i = #bData + 1, __bitNum do
  38. table.insert(bData, 1, 0)
  39. end
  40. end
  41. local resData = {}
  42. for i = 1, __bitNum do
  43. local args = {}
  44. for _, bData in ipairs(bDataLst) do
  45. table.insert(args, bData[i])
  46. end
  47. table.insert(resData, bitFunc(unpack(args)))
  48. end
  49. return btoi(resData)
  50. end
  51. --按位同或
  52. function __bitxnor(bit1, bit2)
  53. return (bit1 == bit2) and 1 or 0
  54. end
  55. --按位异或
  56. function __bitxor(bit1, bit2)
  57. return (bit1 == bit2) and 0 or 1
  58. end
  59. --按位与
  60. function __bitand(bit1, bit2)
  61. return (bit1 == 1 and bit2 == 1) and 1 or 0
  62. end
  63. --按位或
  64. function __bitor(bit1, bit2)
  65. return (bit1 == 1 or bit2 == 1) and 1 or 0
  66. end
  67. --按位非
  68. function __bitnot(bit)
  69. return 1 - bit
  70. end
  71. --2进制转换成10进制
  72. function btoi(bData)
  73. return __ntoi(bData, 2)
  74. end
  75. --10进制转换成2进制
  76. function itob(integer)
  77. return __iton(integer, 2)
  78. end
  79. --10进制转换成N进制
  80. function __iton(integer, num)
  81. assert(type(integer) == "number")
  82. if integer == 0 then
  83. return {0}
  84. end
  85. local bNeg = integer < 0
  86. local ci = math.abs(integer)
  87. local nData = {}
  88. while ci > 0 do
  89. table.insert(nData, 1, ci % num)
  90. ci = math.floor(ci / num)
  91. end
  92. if bNeg then
  93. for i = #nData + 1, __bitNum do
  94. table.insert(nData, 1, num - 1)
  95. end
  96. end
  97. return nData
  98. end
  99. --N进制转换成10进制
  100. function __ntoi(nData, num)
  101. assert(type(nData) == "table")
  102. local integer = 0
  103. for i, data in ipairs(nData) do
  104. integer = integer + data * math.pow(num, #nData - i)
  105. end
  106. return integer
  107. end