淘先锋技术网

首页 1 2 3 4 5 6 7

最近见到一个过程,使用 按位与(&) 实现多转向判断,就是这样的效果,只需一个参数,就可以控制执行 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

  语句...