登录

去注册

登录

注册

去登录

注册

每日一问 Android 有哪些 位运算 的例子很值得借鉴?

xiaoyang   2019-08-13   收藏

都说程序员应该对位运算了如指掌,那么Android中有哪些地方用到了呢?

可否列举一些场景。

3

很多地方,比如Activity中的getWindow().setFlags()用来设置各个窗口属性,还有平常在xml中用的Gravity属性,还有View里面的mViewFlags等等。
就拿View来说,我们平常所设置的Enable, Clickable, Focusable, Visibility等这些状态,都是保存在mViewFlags里的。


在源码中可以看到一些常见的操作(在这里假设Flags为保存状态的变量,MASK为标识):

  • (Flags & MASK) != 0 检查是否有设置MASK标识;
  • (Flags & MASK) == 0 反之,这里是检查MASK标识是否没有被设置;
  • Flags |= MASK 加入MASK标识;
  • Flags &= ~MASK 消除MASK标识;

我们在日常开发中,如果一个类里需要保存多个不同的状态的话,可以借鉴下这种位运算方式。当然了,为了增加代码的可读性,还可以把这些运算封装成方法,并写上注释。

回复
1

自定义View的measureSpec;
Java的Map系列的hash方法;
ReentrantReadWriteLock用高16位保存共享锁的state,低16位保存排他锁的state。

回复
0

说的非常普遍的例子, 在遇到recyclerview与CheckBox嵌套的时候,需要保存CheckBox的状态, 我们刚开始普遍的做法是使用一个hashmap存一个唯一值.
但,其实我们还有一种做法,就是使用位运算来进行储存状态,
打个非常简单的比方

0000 0000 0000  //这样表示全未选中状态, 
1000 0000 0000 //表示第一个位被选中状态

当我们想要改变某一个状态时, 

比如,从
1111 1101 1111
改变成
0000 0010 0000     //这个操作其实就是反选操作

如果 A代表 1111 1101 1111 那么~A 就代表了0000 0010 0000 也就是取反操作


[附上位运算的一些基础知识,方便理解](https://blog.csdn.net/mengzhengjie/article/details/80611422)

注:链接是我随便找的.
回复
0
  1. 二维码
  2. bitmap的模糊
回复
0

flag,如果不用位运算符,属性会多很多个。。。
还有对1,3,7等数的取余也可以用位运算,HashMap的hash值就是这样的,用hashCode和node长度-1,也就是1,3,7这样的数字取并来取余,以次来当做hash值

回复
0

RecyclerView内的ViewHolder的各种状态

回复
0

最佳应用就是状态管理了吧!

回复
0

事件分发机制里的 状态位

回复
0

intent 的 addFlag

回复

删除留言

确认删除留言,会导致相关评论丢失?

取消 确定