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

本文介绍了一种使用位操作来管理状态变化的方法,这种方法通过将不同的状态映射到整型变量的不同位上,实现状态的叠加与检查。相较于传统的布尔变量管理方式更为高效且节省内存。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

看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.没想到,下次补充

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值