编程之“与、或(&|)”的使用技巧

来源:互联网 发布:夏季太极服淘宝网 编辑:程序博客网 时间:2024/06/06 06:00

因为手头开着Dev C++,所以示例代码用C语言来演示了,用JAVA的道理是一样的。


先看一段基本的代码:

#include <stdio.h>int PRIVATE = 0x1;int PUBLIC = 0x2;int FINAL = 0x4;int STATIC = 0x8;int main(){    int yu(int a,int b);    int isPRIVATE(int a);    int isPublic(int a);    int isFINAL(int a);    int isSTATIC(int a);    int identifer = PUBLIC|STATIC;    printf("identifer:%d\n",identifer);    printf("is PRIVATE:%d\n", isPRIVATE(identifer));     printf("is Public:%d\n",  isPublic(identifer));     printf("is FINAL:%d\n",   isFINAL(identifer));     printf("is STATIC:%d\n",  isSTATIC(identifer));    system("PAUSE");    return 0;    }int yu(int a,int b){    return (a&b)!=0;    }int isPRIVATE(int a){    return yu(a,PRIVATE);}int isPublic(int a){    return yu(a,PUBLIC);}int isFINAL(int a){    return yu(a,FINAL);}int isSTATIC(int a){    return yu(a,STATIC);}

这段代码定义了4个标识符,private,public,static,final

首先有一个方法(这里没写出来,java类中有)可以获取一个方法的标识符属性,例如public static void main中就有public和static,返回值包含这两项。

上面在定义4个标识符的时候,使用了1,2,4,8来表示,这4个数的特点是,二进制表示中只有一位是1,其他位是0.


返回值包含public和static时,通过或运算,即可让返回值包含这两项结果

PUBLIC|STATIC = 

0010

1000

--------------------

1010

上面的结果就是10(或运算,只要某位是1,结果就是1,只有(0,0)才是0)。


我们需要做的就是,通过结果10,来判断标识符含有那些字段。


这里就需要用到与(&)运算,与(&)运算是二进制表示中,相同的位如果是(1,1),那么这个位的结果是1,(1,0),(0,1),(0,0)的结果都是0.


因而通过这个运算,我们可以判断,一个数字的某位是否为1,想判断哪位,就用那一位是1,其他位是0的数字是做与运算,如00000100,01000000.


如果到这里能明白,就知道如果那一位是1,那么(1,1)的结果肯定是1,那么整体的结果肯定不是0,所以可以根据&的结果!=0来判断。


这种方式的好处是,可以将多种状态放到一个参数上,通过判断参数来确定不同的状态,在某些情况下可以减少参数的个数。


这个方法在JDK的源码中是有的,类名可能是Modifier,感兴趣的可以找找看。


上面代码的运行结果: