位运算在咱们实际开发中用得不多,主要缘由仍是它对于咱们而言很差读、很差懂、也很差计算,若是不常常实践,很容易就生疏了。但实际上,位运算是一种很好的运算思想,它的优势天然是计算快,代码更少。优化
这里,位掩码的使用就能够巧妙的解决此问题。atom
咱们先将问题简化一下:假设只有8瓶水,其中1瓶有毒。spa
将该矩阵转置,得:code
依上述场景,取4只容器,转置后的矩阵数列配组合溶液:
取数位上为1的水,放入相应的容器,即:
第一杯:只包含8号水
第二杯:包含四、五、六、7号水
第三杯:包含二、三、六、7号水
第四杯:包含一、三、五、7号水orm
取4只老鼠,编号一、二、三、4,分别喝下第一杯...第四杯水,
4只老鼠的生死状态依次记为 w x y z,(w,x,y,z = {0,1})
死亡记做1,非死亡记做0
将二进制数列wxyz转为十进制,则获得有毒水的号码。
假设6号水有毒,那么往回推算,不难看出,第二、3只老鼠会死亡,
获得的wxyz的数列就是0110,转十进制后就是6。blog
将1000瓶依次编号:1,2,3,4,...,1000; 且都记做二进制;
那咱们要用多少位来表示呢?
总数是1000,2^9=512, 2^10=1024,因而至少要10位才够表示,
也就是:0000000001,0000000010,0000000011,...,1111101000;
道理同上。内存
咱们已经见识了二进制的厉害之处了,接下来咱们结合代码来看看,在iOS开发中的应用(其实在任何开发中都同样)开发
@interface BM_User : NSObject @property (nonatomic, assign) BOOL permission1; @property (nonatomic, assign) BOOL permission2; @property (nonatomic, assign) BOOL permission3; @property (nonatomic, assign) BOOL permission4; @end
那用户A同时拥有permission一、permission二、permission4怎么表示呢?it
BM_User *userA = [[BM_User alloc] init]; userA.permission1 = YES; userA.permission2 = YES; userA.permission4 = YES;
这样的操做你们见多了吧?那咱们来看看另外一种写法:io
@interface BM_User : NSObject @property (nonatomic, assign) OptionPermission permission; @end
有人就要问了,OptionPermission是什么鬼?来,继续。。。
/** 权限枚举 - 1: permission1,二进制第1位,0表示否,1表示是 - 2: permission2,二进制第2位,0表示否,1表示是 - 4: permission3,二进制第3位,0表示否,1表示是 - 8: permission4,二进制第4位,0表示否,1表示是 */ typedef NS_OPTIONS(NSUInteger, OptionPermission) { permission1 = 1 << 0,//0001,1 permission2 = 1 << 1,//0010,2 permission3 = 1 << 2,//0100,4 permission4 = 1 << 3,//1000,8 };
那用户A同时拥有permission一、permission二、permission4怎么表示呢?
BM_User *userA = [[BM_User alloc] init];
userA.permission = permission1 | permission2 | permission4;
是否是神清气爽?
如今咱们就具体化4种权限,并给出基础位掩码的表达及运算:
#ifndef BM_Head_h #define BM_Head_h /** 权限枚举 - 1: 是否容许查询,二进制第1位,0表示否,1表示是 - 2: 是否容许新增,二进制第2位,0表示否,1表示是 - 4: 是否容许修改,二进制第3位,0表示否,1表示是 - 8: 是否容许删除,二进制第4位,0表示否,1表示是 */ typedef NS_OPTIONS(NSUInteger, OptionPermission) { ALLOW_SELECT = 1 << 0,//0001,1 ALLOW_INSERT = 1 << 1,//0010,2 ALLOW_UPDATE = 1 << 2,//0100,4 ALLOW_DELETE = 1 << 3,//1000,8 }; #endif /* BM_Head_h */ #import "BM_Permission.h" #import "BM_Head.h" @interface BM_Permission () /** 存储目前的权限状态 */ @property (nonatomic, assign) OptionPermission flag; @end @implementation BM_Permission /** 从新设置权限 */ - (void)setPermission:(OptionPermission)permission { self.flag = permission; } /** 添加一项或多项权限 */ - (void)enable:(OptionPermission)permission { self.flag |= permission; } /** 删除一项或多项权限 */ - (void)disable:(OptionPermission)permission { self.flag &= ~permission; } /** 是否拥某些权限 */ - (BOOL)siAllow:(OptionPermission)permission { return (self.flag & permission) == permission; } /** 是否禁用了某些权限 */ - (BOOL)isNotAllow:(OptionPermission)permission { return (self.flag & permission) == 0; } /** 是否仅仅拥有某些权限 */ - (BOOL)isOnlyAllow:(OptionPermission)permission { return self.flag == permission; }
做者:Leewins连接:https://www.jianshu.com/p/4e73512c03b8