与运算:&:
语法:相同位的两个数字都为1,则为1;若有一个不为1,则为0
举例:10011001&00110010:
10011001
&
00110010
---------------------------------------------------------------------------------------------------------
=00010000
从上面第例题,我们可以发现,我们可以利用与&运算判断二进制的某个数从0位到七位的任何一位数是0还是1;我们写一个判断的模板:只需要我们将需要判断的位数所对应的模板位数的值设置为1即可(不能设置为0,因为0和任何数&运算结果都是0,起不到判断作用)
例如下面的数:我们需要对他的第三位和第五位判断:
10110011
我们要得出所有第三位是0,第五位是1的数:**1* 0***
那么这个它对应的判断模板就要是:00101000
对应关系如下:
结果模板:**1* 0***
判断模板:00101000(需要判断的位数对应模板值设为1)
**1* 0***&00101000=00100000
因此:任何数*********&00101000只要结果是00100000,就符合要求,就一定是**1* 0***格式;
总结:上面的步骤:
1、 确定我们要判断的二进制数的具体位数
2、 根据上面的结果写出模板
3、 计算出符合要求的二进制数与模板的计算结果
4、 用于判断即可
使用场景举例:
在sql查询的时候,如果有很多条件需要我们判断,那么我们可以使用二进制,不同位数的值来表示不同的状态:实现一个字段表示很多种条件的状态!!!;
以MZ_SF表的STATE字段为例:
STATE:BIT0: 0=未退款 1=退款(第0位)
; BIT1: 0=未日结 1=已日结
; BIT2: 0=挂号处收费 1=收费处收费
; BIT3: 0=未重打发票 1=已重打发票
; BIT4:0=参保 1==不参保
; BIT5-6:
; 00=收费处处方 10=电子处方
; 01=药房划价 11=体检处方
; BIT7: 0=已收费 1=未收费(第7位)
↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑
那么01101001就表示:已收费,体检处方,参保,未重打发票,挂号处收费,未日结,退款状态的门诊收费数据;
那么我们就可以根据上面的方法判断具体的某个条件的状态;从而实现过滤查询的效果;
例题:
1、获取当天已收费未退款的所有处方。0*** ***0
2、获取当天已收费未退款已日结的所有处方。
3、获取当天已收费未退款已日结的电子处方。
答案
1:
分析:第一题对应的结果模板是:0*** ***0
判断模板是1000 0001(转换成十进制是129)
结果模板和判断模板运算结果是0*** ***0&1000 0001=0
因此sql为:
Select * from MZ_SF where state &129=0
state符合(state &129=0)的处方都查出来了
2:
Select * from MZ_SF where state & 131 = 2
3:
Select * from MZ_SF where state & 227=66