关于位掩码的有趣小实验及其应用

其实网上很多大佬有写这个啦,但是自己觉得很有趣就决定叭叭一篇博客出来,为了方便看就用pad画图了。写的很浅显,没什么大作用就是觉得很好玩(:-)∠L)

位掩码其实就是应用位运算来实现一些复杂的操作,利用二进制的0和1来实现。

比如很有名的小白鼠试毒问题。
假设有八杯水。有一杯水有毒,小白鼠喝下24小时后会死,现在需要在24小时内检验出哪杯水有毒。问题:需要几只小白鼠?怎么检验?

这是一个典型的利用位掩码处理的问题。根据题目条件,必须利用小白鼠的死亡情况一次检测出哪杯水有毒。问题的处理方式如下:

我们将八杯水编号为1-8,每杯水用二进制表示,将每列的混合水分别喂给ABCD四只小白鼠。比如A鼠将喝下八号水,而C鼠将喝下4/5/6/7的混合水:

示意图

24小时后记录小白鼠的死亡状态。
比如AC小鼠存活,BD小鼠死亡,那么我们可以得到一串二进制:0101
即可知道5号水有毒。

如果设定一千杯水中有一杯有毒,则需要10小白鼠,原理与上面描述类似。

下面介绍下位掩码在实际中的应用:
比如,我们设立一个OA系统,它的基本功能是增,删,改,查,那么我们定义每个用户的权限可以写成:

var user = 
{
  add: true,
  delete: false,
  update: false,
  search: true
};

但如果用位掩码,设立一个四位的二进制数,其第一位为1表示add权限,第二位为1表示删除权限,以此类推。在表示某一用户拥有某些权限时就会变得非常省事。

具体更多的应用及描述可以参考一下这个文档
https://blog.csdn.net/weixin_42856903/article/details/104357501

你可能感兴趣的:(关于位掩码的有趣小实验及其应用)