位运算在Android Flag中的巧妙使用

来源:互联网 发布:二叉树中序非递归算法 编辑:程序博客网 时间:2024/05/22 17:06

我们都知道Android源码,博大精深,但似乎还有一些细节被我们忽略。

一、诡异的Flag

从以前就发觉,android源码中一些Flag设置的很诡异,比如WindowManager.LayoutParams中的一些Flag:

public static final int FLAG_ALLOW_LOCK_WHILE_SCREEN_ON     = 0x00000001;public static final int FLAG_DIM_BEHIND                     = 0x00000002;public static final int FLAG_BLUR_BEHIND                    = 0x00000004;public static final int FLAG_NOT_FOCUSABLE                  = 0x00000008;public static final int FLAG_NOT_TOUCHABLE                  = 0x00000010;public static final int FLAG_NOT_TOUCH_MODAL                = 0x00000020;public static final int FLAG_TOUCHABLE_WHEN_WAKING          = 0x00000040;public static final int FLAG_KEEP_SCREEN_ON                 = 0x00000080;

这整齐分布的1/2/4/8是什么鬼?然而更奇怪的事还在继续……

二、Flag进行位运算?

我们平日里应该经常遇见,把一些Flag组合的情况:

int flag = View.SYSTEM_UI_FLAG_LAYOUT_STABLE|View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN

这种形式我们肯定习以为常了,但是我想问:为什么通过或运算就可以组合Flag使用呢?

三、神奇的位运算

到此,我们就要开始揭开这层神秘面纱。

首先说第一个,为什么Flag中总是用1/2/4/8?

我们看下1/2/4/8分别对应的二进制数:

1 : 0001
2 : 0010
4 : 0100
8 : 1000

通过二进制,我们可以看出来,每一个Flag代表二进制上的一位,并且是1。他们通过“或运算”可以组成1~15之间的数,比如:

1|8 = 9 —> 1001
2|4 = 6 —> 0110
1|2|4|8 = 15 —> 1111

并且任意组合之间不会相同,除非是相同数字。有几个1,就代表有几个Flag,根据1的分布,就可以判别出,是哪几个Flag组合的。于是有了这个特点,第二个疑问就可以解答了。

这些Flag以十六进制的形式,按1/2/4/8的规律分布,用“或运算”便可以”叠加“了。然后我们看看位运算其他一些妙用:

1、判断Flags是否包含某个Flag

if ((winParams.flags & WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS == 0){           //条件为真(即等于0),不包含

因为每个Flag,对应二进制中的某一位。与运算为0的话,说明flags中对应的二进制位为0,即没有该Flag。

2、清除Flag

下面这段代码是干货集中营中的源码:

private void setTranslucentStatus(boolean on) {        Window win = getWindow();        WindowManager.LayoutParams winParams = win.getAttributes();        final int bits = WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS;        if (on) {            winParams.flags |= bits;        } else {            winParams.flags &= ~bits;//清除FLAG_TRANSLUCENT_STATUS        }        win.setAttributes(winParams);    }

当on为true时,添加FLAG_TRANSLUCENT_STATUS;当on为false时,清除FLAG_TRANSLUCENT_STATUS。

总结

以前我也收录过一篇位运算的博客:位运算及其应用实例

刚开始接触位运算的时候,只以为这就是刷刷计算题,应付考试用的。但是现在越来越感觉位运算的强大之处,在提高效率方面,位运算的作用是无与伦比的。并且一旦使用出来,还会让人觉得神神秘秘的,哈哈。

1 0
原创粉丝点击