关于Android源码中|= (m & STATIC_VALUE) !=0 的理解

看Android源码时发现有很多地方都用这种方式

private static final int STATIC_CHANGE_1 = 1 << 0 ;
private static final int STATIC_CHANGE_2 = 1 << 1 ;

private static final int STATIC_CHANGE_A = 1 << 2 ;
private static final int STATIC_CHANGE_B = 1 << 3 ;

private static final int STATIC_CHANGE_C = 1 << 4 ;
private static final int STATIC_CHANGE_3 = 1 << 5 ;
private static final int STATIC_CHANGE_4 = 1 << 6 ;


private int mDirty = 0;


如果STATIC_CHANGE_1 代表的变化发生了,就用 mDirty |= STATIC_CHANGE_1 ;

如果要判断STATIC_CHANGE_1 是否发生了,就判断 mDirty & STATIC_CHANGE_1 != 0,为true则发生了。


想想其实这和View测量的数值有点类似,把两个数合成在一起,低两位代表一个值,高位代表另外一个值。


这里的mDirty的二进制每一位相当一个boolean,因为每个static都是*2的,所以不会互相干扰。

比如mDirty = 0 ,先是 |= STATIC_CHANGE_1 就是 0 |= 1 -----》 1

再 |= STATIC_CHANGE_A  (4) --》  1 |= 100  --》 101

这样在判断STATIC_CHANGE_1 和STATIC_CHANGE_A 的时候,都能判断出是否改变过,化成二进制的时候明显可以看到,

对应位置上1就是true,0就是false。



为什么?

先来看看传统做法:

private boolean change1 = false;

private boolean change2 = false;

....................

可以看到声明了很多的私有变量,而且不优雅。


什么情况可以用?

1.状态可以叠加,就是change1并不会覆盖change2

2.没想到,下次补充

猜你喜欢

转载自blog.csdn.net/ccc905341846/article/details/78819583