骚操作!使用二进制模型,仅靠0和1保存数据

前言

需要在属性表配置用户环境变量的字段,为了节省内存空间,主管让我用一个字段记录多个数据状态,开始用表结构,但客户端不支持,就想到二进制数值保存数据

测试效果

先简单测试了下使用效果,数据很直观,代码如下图:
活动奖励储存:以前的用法是rewardlist表储存已领取奖励列表也很方便,用数值的话更省空间
示例:奖励列表有7个id。表结构{1,2,4,6},对应二进制数字0101011(43)
在这里插入图片描述
打印方法

--10进制转二进制。n需要转的数,m几位数,二进制只有8位,改造了下
function byte2bin(n,m)
    local t = {}
    if not m then
        m = 8
    end
    for i=m-1,0,-1 do
        t[#t+1] = math.floor(n / 2^i)
        n = n % 2^i
    end
    return table.concat(t)
end

项目使用

需求

配置表用户设置默认值,现在改成默认0
在这里插入图片描述
统一格式使用数值类型,转成二进制数记录修改后格式如下图

{ "userset"				,"int(11)"		,0
--0默认开放 是否播放bgm--是否允许好友申请--是否预设聊天内容--是否播放bgm
,"用户个性设置" },

功能接口

--用户个性设置修改
function Player:ChangeUserSetting(type)
	if 	self.cache.userset & (1<<(type - 1)) ~= 0 then
		--已设置为1
		self.cache.userset = self.cache.userset &~(1<<type-1)
	else
		self.cache.userset = self.cache.userset | (1<<(type - 1))
	end
	--个性设置
	self.prop.userset = self.cache.userset
	return true
end

因为只有简单的开关设置,所以设置时候1的类型改为0,0的类型改1

服务器测试结果

在这里插入图片描述
初始userset属性为0默认打开,调用四次Player:ChangeUserSetting(type=1,2,3,4)方法后为15(1111)四个设置关掉
在这里插入图片描述
再调用一次Player:ChangeUserSetting(type = 4)关掉,打印结果7 = 15-8测试开关没有问题

嵌入功能

我们只需获取所需位数的值

--获取二进制数据索引值(1右到左)
function lua_util.getbyte2index(x,index)
	return (x>>index-1) & 1
end

这里是判定好友申请设置,如果不为0则不接受申请好友

--申请添加好友
function Friend:ApplyFriend(dbid)
	local target = server.playerCenter:DoGetPlayerByDBID(dbid)
	local targerdata = target.cache.friend_data
	if lua_util.getbyte2index(target.prop.userset,settype) ~= 0 then
		server.chatCenter:sendTipMsg(1712,self.player.cache.dbid)
		return false
	end
    (……省略)
end

类型控制

UserSetConfig.SettingType = {
    isOpenBgm = 1, --是否播放bgm
    isApplyFriend = 2, --是否允许申请好友
    isdefalutChat = 3,--是否默认聊天框
    test = 4,--
}
local settype = UserSetConfig.SettingType.isApplyFriend

二进制骚操作也很多,学习还是有用的

展开阅读全文

Windows版YOLOv4目标检测实战:训练自己的数据

04-26
©️2020 CSDN 皮肤主题: 编程工作室 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值