最近见到一个过程,使用 按位与(&) 实现多转向判断,就是这样的效果,只需一个参数,就可以控制执行 0 个、1个、多个 if 块中的语句。
这个应用利用 参数 和 预定义的常数 &,判断结果是否为 0 实现。
这样的常数只能是:1、2、4、8、16 ... ,这些常数的特点是,其二进制形式中左第一位是1,后面所有有效位都是 0,因此比这类数小 1 的数二进制所有有效位都是 1。
比如
1 二进制 1
2 二进制 10, 1 的二进制 1
4 二进制 1000,3 的二进制 11
等。
(这类数有个学名,我不记得了,不知道名字因此也找不到资料,后悔学生时代混过来。。暂时叫 C 型常数)
和这些数进行 & 运算的参数(A),在运算后有这样的规则:
1、A 的二进制全 1 ,则所有比 A 小的数 & 的结果都是原数,即 非 0。这类数是 3、7、15 等;
2、C 型只能把相同数 & 出 非0;
3、不是 1、2 的数,就是把 A 拆成小于 A 的 C 型数,这样的数 & 出非 0,其他的还是 0。
:
3 是猜的,不能验证。
比如:
A==1,A & 1 =1;
A==2,A & 2 =2, A & 1 =0;
A==3,A & 1 =1, A & 2 =2;
A==4,A & 1 =0, A & 2 =0, A & 4=4;
对应的存储过程中的应用示例:
declare @A int
if @A & 1 <>0
语句...
if @A & 2 <>0
语句...
if @A & 4 <>0
语句...