分享一个二进制的应用。应用场景举例,在游戏中,存在一些非固定顺序的新手引导,需要存储玩家引导的数据,各个引导是否执行过,依次来判断是否触发。比如有十个步骤,我们可以通过使用键值对来存储这些引导的状态,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,然后再进行与或操作时不会影响其他标签。