理解位运算:一个营销活动的实例

36 阅读3分钟

一、场景假设

某天,业务人员发来一个任务:

设计一个可以灵活配置的营销活动,具体有三种达标规则:

规则A :今日消费单笔满20元
规则B :今日在合作商户有一笔消费
规则C : 客户属于中高端客户

这些规则可以任意组合,用来生成一个营销活动。  

比如,第一个月的活动中,只要客户满足规则A就可以参与抽奖;  

而在第二个月,满足规则A或规则C的客户都可以参与抽奖。

二、思路设计

根据业务需求,我们需要让活动支持灵活配置不同的规则。

客户的每笔交易经处理后应该带上三个标识字段即A_Flag、B_Flag、C_Flag。

当标识字段为0时,表示该规则未达标。
当标识字段为1时,表示该规则达标。

我们要根据这些标识来判断客户是否满足活动的规则:

  1. 首先从规则表中获取当前活动的有效规则;

  2. 然后对客户每笔交易进行检查,如果符合活动要求的所有规则都达标,就认为客户满足条件。

三、参考案例

3.1 知识铺垫--位运算

计算机中数据都以二进制形式存储,即 0 和 1 两种状态。

对二进制数据进行的运算被称为位运算[1]。

(1) 位运算 "或"

特点:只要有一个为1,其值为1。

比如2(对应的二进制形式0010)和4(对应的二进制形式0100),两者进行"或"运算后对应的结果为6。

位运算或_final.png

(2)  位运算 "与"

特点:只有两位同时为1时,结果才为1,否则结果为0。

比如2和4进行"与"运算后对应的结果为0。

位运算与_final.png

3.2 Linux系统中的文件权限管理

在Linux系统中,每个文件都有不同的权限,比如读、写和执行。

这些权限可以用二进制数字表示。

r(读):  100
w(写):  010
x(执行): 001

通过对三种权限进行灵活组合(即进行 "或" 位运算操作),就可以配置多种权限。

权限组合.png

比如可通过以下命令,让用户user1对文件 test.txt 拥有全部的操作权限。 (注:命令"700"中的第一个"7"代表user1的权限)

chmod 700 test.txt

四、具体代码设计

4.1 规则设计(枚举类,Java语言)

public enum RuleType {    
//此处定义了三种规则作为示例,它们可以扩展为更多的规则      
RULE_A(0b1),    // 二进制表示,等于十进制的1    
RULE_B(0b10),   // 二进制表示,等于十进制的2    
RULE_C(0b100);  // 二进制表示,等于十进制的4    
int type;    
RuleType(int type) {        
this.type=type;    
}

public int getType(){        
return type;    
}

}

4.2 结果验证

  (1) 先从配置表中拿出本次活动生效的规则,经过 "或"运算后结果记为X

 int X =    (rule_A_Exists ? RULE_A.getType():0)          
          | (rule_B_Exists ? RULE_B.getType():0)           
          | (rule_C_Exists ? RULE_C.getType():0)

注:(a?b:c)为三元运算符,意思是a如果成立则取b否则取c.

(2) 将客户消费记录中的规则标识字段值进行"或"运算, 结果记为Y

 int Y =    (A_Flag == 1 ? RULE_A.getType():0)           
          | (B_Flag == 1 ? RULE_B.getType():0)           
          | (C_Flag == 1 ? RULE_C.getType():0)

(3) 将 X与Y 进行 "与"运算后再判断结果是否等于X

String result = ( (X&Y)==X ?"达标":"不达标" )

注:只有X和Y相等,进行"与"操作后才能等于X。

五、参考资料

位运算