位运算在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。
总结
以前我也收录过一篇位运算的博客:位运算及其应用实例
刚开始接触位运算的时候,只以为这就是刷刷计算题,应付考试用的。但是现在越来越感觉位运算的强大之处,在提高效率方面,位运算的作用是无与伦比的。并且一旦使用出来,还会让人觉得神神秘秘的,哈哈。
- 位运算在Android Flag中的巧妙使用
- 位运算在Android中的使用场景
- Android中巧妙的位运算(Android源码中常见的一些flag的运算的理解)
- Android中巧妙的位运算(Android源码中常见的一些flag的运算的理解)
- 位运算的巧妙使用
- singleNum以及位运算符在编程中的运用(巧妙运用位操作)
- Android中巧妙的位运算
- Android中巧妙的位运算
- Android中巧妙的位运算
- Android中巧妙的位运算
- 位运算 flag mask
- 位与运算在iOS中的使用
- 位运算巧妙用法
- 二进制位运算在算法中的巧妙运用
- Android中的位运算
- Android中的位运算
- 系统入门(17):Android中巧妙的位运算
- 位运算的巧妙运用
- day09内部类
- 怎么解析Json数据,然后把解析到的Json数据填充到布局中?
- 一些需要准备的东西
- UNITY之iTween
- 斯坦福大学深度学习与自然语言处理
- 位运算在Android Flag中的巧妙使用
- 【NOIP 模拟题】旅行(最短路)
- tjut 4287
- 1026 程序运行时间
- javascript的一个简单语法,记录下来
- 问题七 上下机
- 互联网-手机圈那些事
- OpenGL 三维变换
- arm9 norflash与nandflash启动过程分析