二进制在数据存储上的应用

分享一个二进制的应用。应用场景举例,在游戏中,存在一些非固定顺序的新手引导,需要存储玩家引导的数据,各个引导是否执行过,依次来判断是否触发。比如有十个步骤,我们可以通过使用键值对来存储这些引导的状态,key为引导id,value为引导状态,修改的时候直接去赋值即可。今天分享另一种更为高效,节能的存储方式。

代码及运行结果如下:

class Program
    {
        static Dictionary<string, int> datas = new Dictionary<string, int>();//所有引导步骤
        static int dataState = 0;//数据状态,默认值为0,这里可看为二进制0000000000

        static void Main(string[] args)
        {
            datas.Add("step1", 1 << 0);
            datas.Add("step2", 1 << 1);
            datas.Add("step3", 1 << 2);
            datas.Add("step4", 1 << 3);
            datas.Add("step5", 1 << 4);
            datas.Add("step6", 1 << 5);
            datas.Add("step7", 1 << 6);
            datas.Add("step8", 1 << 7);
            datas.Add("step9", 1 << 8);
            datas.Add("step10", 1 << 9);

            foreach (var item in datas)
            {
                SaveData(item.Key);
                Console.WriteLine(Convert.ToString(dataState,2).PadLeft(10,'0'));
            }
            



        }

        static void SaveData(string key)
        {
            int flag = datas[key];//1.获取对应key的flag
            int result = flag & dataState;//2.将flag与当前引导进行与操作,如果值不为0,则表示当前key对应的引导已经完成,不做处理,否则表示未完成,进行存储
            if (result != 0) return;
            dataState = dataState | flag;//3.或操作,进行合并


            /*举例代入数值(不是实际运算数值),以下数据表示都是二进制
            此时dataState为0,传入key为step5
            1.获取到flag:10000
            2.与操作,0000000000 & 10000 = 0//表示当前key 的引导未执行
            3.或操作,0000000000 | 10000 = 0000010000

            此时dataState为0000010000,传入key为step3
            1.获取到flag:100
            2.与操作,0000010000 & 100 = 0//表示当前key 的引导未执行
            3.或操作,0000010000 | 100 = 0000010100

            此时dataState为0000010100,传入key为step5
            1.获取到flag:10000
            2.与操作,0000010100 & 10000 = 10000//表示当前key 的引导已执行,返回
            */
        }
    }

分析一下不难理解,原理是给每一个步骤设定唯一的标签,这些标签的特征是,除了唯一位是1,其他位全都是0,然后再进行与或操作时不会影响其他标签。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值