对常量进行‘|’和‘&’运算的意义

有时我们需要在代码中定义一些常量代表不同的状态,一般做法就是定义成字符串或者int类型,比如:

public static final String CONTEXT_INCLUDE_CODE = "context_include_code" 
public static final String CONTEXT_IGNORE_SECURITY = "context_ignore_security"
public static final String CONTEXT_RESTRICTED = "context_restricted"

在需要的时候用if判断一下(flag代表传入的状态,下同):

if(flag.equals(CONTEXT_INCLUDE_CODE)){}

这种写法不是不可以,缺点是它内存占用会大一些。如果换成int 可能会比字符串要好一些。

但是但是,如果我们的状态处于上面三种状态的两种,也就是flag可以不可以代表CONTEXT_INCLUDE_CODE或CONTEXT_IGNORE_SECURITY。这个时候我们该怎么做?有没有可能两种状态都存在的情况?


在学习android开发的时候经常会遇到用 16进制去定义常量,这到底有什么好处呢? 我把上面的定义还原成16进制的定义:

public static final int CONTEXT_INCLUDE_CODE =  0x00000001 // 00001
public static final int CONTEXT_IGNORE_SECURITY = 0x00000002 // 00010
public static final int CONTEXT_RESTRICTED = 0x00000004// 00100

后面的注释简单表示它们的二进制形式。

这里定义的每个常量的值对应的二进制只有一位为1其他都为0。如果还有新的变量,新的值就是0x00000008(01000)。为什么这样?因为其他值可以用定义的变量表示。比如:

flag = CONTEXT_INCLUDE_CODE | CONTEXT_IGNORE_SECURITY =0x00000003// 00011

如此,flag就代表两种状态了,那么判断的时候就不能:

if(flag == CONTEXT_INCLUDE_CODE){}//上面flag的条件就不满足该条件

通过&算符判断就可以满足了,改成:

if((flag & CONTEXT_INCLUDE_CODE) == CONTEXT_INCLUDE_CODE){}

可能有对 ‘|’和‘&’不太熟悉的,这里简单介绍一下:
‘|’是‘或’的意思,对应的运算法则:‘逢1为1’,比如:

0x00000001 二进制为 00001,0x00000002位00010;
0x00000001 | 0x00000002 = 00001 | 00010 = 00011 = 0x00000003.
通俗的理解在二进制数上 只有0和1,‘|’表示 不同为1,相同不变。

‘&’代表‘与’的意思,对应的运算法则:‘同1为1,其他为0’;比如:
0x00000001 & 0x00000002 = 00001 & 00010 = 00000 = 0x00000000.

备注:新手一枚,请大神多大指点!

猜你喜欢

转载自blog.csdn.net/weixin_38801333/article/details/75501792