用Lua实现位运算

前言

        由于做礼包激活码的时候需要对激活码进行一些位运算,所以就写了这个模块。一般这些位运算操作建议还是在C++里面写,由于游戏已经发出去了,只想用自动更新来更新这个功能,所以逼于无奈只能先用LUA来实现一下。如果有朋友也是遇到不方便更新C++,只想用LUA来实现的话,希望这里可以帮到你。


代码

module("common.bit", package.seeall)

local bitLen = 32

local function numberToBits(src)
  local result = {}
  for i = 1, bitLen do
    result[i] = src % 2
    src = math.floor(src / 2)
  end

  return result
end

local function bitsToNumber(src)
  local result = 0
  for i = 1, bitLen do
    if src[i] == 1 then
      result = result + 2 ^ (i - 1)
    end
  end

  return result
end

function SetBitLen(len)
  bitLen = len
end

function GetBitLen(len)
  return bitLen
end

function Lsl(src, dst)
  return src * 2 ^ dst
end

function Lsr(src, dst)
  return math.floor(src / 2 ^ dst)
end

function Xor(src, dst)
  local srcBit = numberToBits(src)
  local dstBit = numberToBits(dst)
  local result = {}

  for i = 1, bitLen do
    result[i] = (srcBit[i] == dstBit[i] and 0 or 1)
  end

  return bitsToNumber(result)
end

function And(src, dst)
  local srcBit = numberToBits(src)
  local dstBit = numberToBits(dst)
  local result = {}

  for i = 1, bitLen do
    result[i] = ((srcBit[i] == dstBit[i] and srcBit[i] == 1) and 1 or 0)
  end

  return bitsToNumber(result)
end

function Or(src, dst)
  local srcBit = numberToBits(src)
  local dstBit = numberToBits(dst)
  local result = {}

  for i = 1, bitLen do
    result[i] = ((srcBit[i] == dstBit[i] and srcBit[i] == 0) and 0 or 1)
  end

  return bitsToNumber(result)
end

function Not(src)
  local srcBit = numberToBits(src)
  for i = 1, bitLen do
    srcBit[i] = (srcBit[i] == 1 and 0 or 1 )
  end

  return bitsToNumber(srcBit)
end

function HexStringToNumber(hexString, isBigEndian)
  local result = ""
  if not isBigEndian then
    local count = math.floor(string.len(hexString) / 2)
    while count > 0 do
      local index = count * 2 - 1
      result = result .. string.sub(hexString, index, index + 1)
      count = count - 1
    end
  else
    result = hexString
  end

  return tonumber(result, 16)
end


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值