位运算在我们实际开发中用得很少,主要原因还是它对于我们而言不好读、不好懂、也不好计算,如果不经常实践,很容易就生疏了。但实际上,位运算是一种很好的运算思想,它的优点自然是计算快,代码更少。
image
这里,位掩码的使用就可以巧妙的解决此问题。
我们先将问题简化一下:假设只有 8 瓶水,其中 1 瓶有毒。
image
将该矩阵转置,得:
image
依上述场景,取 4 只容器,转置后的矩阵数列配组合溶液:取数位上为 1 的水,放入相应的容器,即:第一杯:只包含 8 号水 第二杯:包含 4、5、6、7 号水 第三杯:包含 2、3、6、7 号水 第四杯:包含 1、3、5、7 号水
取 4 只老鼠,编号 1、2、3、4,分别喝下第一杯...第四杯水, 4 只老鼠的生死状态依次记为 w x y z,(w,x,y,z = {0,1}) 死亡记作 1,非死亡记作 0 将二进制数列 wxyz 转为十进制,则得到有毒水的号码。假设 6 号水有毒,那么往回推算,不难看出,第 2、3 只老鼠会死亡, 得到的 wxyz 的数列就是 0110,转十进制后就是 6。
将 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 同时拥有 permission1、permission2、permission4 怎么表示呢?
BM_User *userA = [[BM_User alloc] init];
userA.permission1 = YES;
userA.permission2 = YES;
userA.permission4 = YES;
这样的操作大家见多了吧?那我们来看看另一种写法:
@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 同时拥有 permission1、permission2、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;
}
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有