业务系统中有时会有许多“是/否”的信息项,在实现上的常用方法是:为每个信息项设计一个字段,但这种方法也有一个弊端:1. 如果这种信息项很多,数据表的字段就会特别多,浪费空间;2. 如果业务上增加新的信息项,数据库增加字段不说,需要前后端代码同时做许多代码的更改;下面我们就用一个“位运算”的方法解决以上问题; 我们学过计算机基础理论,”二进制”就是一串1和0;“1/0”和“是否”有非常相似的含义,那么我们就可以尝试使用二进制的“位运算”来实现业务系统中的类似“是/否”的标志位;
数据库设计方面,可以设计一个足够长的bit类型, 比如bit(80),可以容纳80个标志位了,但它所占的空间仅等同于一个varchar(10),如果用满这个bit字段的话,一个字段可以替代80个字段,太划算了;
二进制表示举例:32的二进制表示为:00100000;第6位是Yes,其他位是No;36的二进制表示为:00100100;第3、6位是Yes,其他位是No;
假设我们有4个用例,针对一个二进制数X:
a. 无论原来第三位是Yes还是No,把第3位设为Yes,其他位保持不变;
b. 无论原来第三位是Yes还是No,把第3位设为No,其他位保持不变;
c. 更改第三位的值,如果原来是Yes则改为No,如果原来为No则改为Yes,其他位保持不变;
d. 取出第三位的值;
实现方法很简单:
a. X = X | 4; b. X = X & ~4; c. X = X^4; d. X&4(得到0表示第三位是No,得到4表示第三位是Yes)
经测试Java和MySQL都可以用以上的位运算符号,用法相同;
举例:
加标志位:32|4=36
加标志位:36|4=36
减标志位:32&~4=32
减标志位:36&~4=32
改标志位:32^4=36
改标志位:36^4=32
取标志位:32&4=0
取标志位:36&4=4