android位运算简单讲解
一、前言
在查看源码中,经常会看到很多这样的符号“&”、“|”、“~”,咋一看挺高大上;仔细一看,有点懵;再看看,其实就是大学学过的再普通不过的与、或、非。今天小盆友就以简单的形式分享下,同时也是作为笔记记录,等某天突然懵逼时可以回来看看,话不多说,开始撸。
二、与或非是啥?
或许,大学上的课,在还没毕业时就还给老师了,所以我们先重温下。
1、与运算符 &
知识点:两位同时为“1”,结果才为“1”,否则为“0”。
运算规则:0&0=0; 0&1=0; 1&0=0; 1&1=1;
System.out.println("0 & 0" + (0 & 0));
System.out.println("0 & 1" + (0 & 1));
System.out.println("1 & 0" + (1 & 0));
System.out.println("1 & 1" + (1 & 1));

其实就是运算的位要完全一样,才保持原样,否则就变为0。
2、或运算符 |
知识点:只要有一位为1,其值为1,否则位0。
运算规则:0|0=0; 0|1=1; 1|0=1; 1|1=1;
System.out.println("0 | 0 = " + (0 | 0));
System.out.println("0 | 1 = " + (0 | 1));
System.out.println("1 | 0 = " + (1 | 0));
System.out.println("1 | 1 = " + (1 | 1));

其实就是只要有1,结果就为1。
3、非运算符 ~
知识点:如果位为0,结果是1。如果位为1,结果是0
运算规则:~0=1; ~1=0;
System.out.println("~1 = " + ~(1));
System.out.println("~0 = " + ~(0));

很惊喜!很意外!有没有?!竟然不是0和1,这里不是计算机出问题了,而是涉及到了计算机内部的编码的问题,是不是想到了大学有一门课叫做《计算机科学导论》。详细讲解可以查看这里=>传送门为了方便查看,我从文章截了一张图
三、实战
逼逼叨了这么多,其实位运算符的文章很多,这里其实还少了一个异或运算符,但因为没有出现在实战中,所以就不做多余的操作了。我们来进行真正的运用吧。
1、场景一(或运算符的使用)
你有没有在xml中这样编写过布局
android:layout_gravity="bottom|right"
我们这里就不用bottom、right在源码中真实的值,以方便讲解
这里的 bottom 和 right 在位上肯定是错开的,这样做位运算时,才能同时保存该控件 “居右”和“底部” 的属性。
什么叫位上错开,且看下面代码。
// 0x001 = 0000 0001
int right = 0x001;
// 0x001 = 0000 0010
int bottom = 0x002;
// 结果 = 0000 0011 = 3
System.out.println("right | bottom = " + (right | bottom));

通过上面的代码,或许你已经恍然大悟(雾?),其实位错开是为了或运算时,进行值的保留。 让两个状态的能够保存在一个属性中,或许你会问这样有什么好处了?我挠了下头,想到了以下三个好处:
- 节省空间,避免不必要的属性出现和维护成本(难道你想一个状态用一个布尔值来维护么?手动讥讽,哈哈)
- 获取方便,编码简洁
- 装bi,不装bi的程序员不是好的搬砖工
2、场景二(与运算符的使用)
上一小节说的是如何组装成一个值,要怎么使用它呢?安卓源码中怎么知道我们设置了 right 这个居右的状态呢?这个便需要使用 “与” 运算符来 取值。具体操作如下代码:
int right = 0x001;
int bottom = 0x002;
int top = 0x008;
int state = right | bottom;
System.out.println("是否存在 right = " + ((state & right) == right));
System.out.println("是否存在 top = " + ((state & top) == top));

从上面的代码很清晰的看出,用 “与” 运算符进行 “取值”。是不是有点小惊喜呢?
3、场景三(非运算符的使用)
或许,你会有这样的一个疑问,如果我想剔除当前已经包含的一个值,需要怎么办?这时候就是“非”和“与”运算符联合使用的时候了,且看下面代码
int right = 0x001;
int bottom = 0x002;
int top = 0x008;
int state = right | bottom;
System.out.println("剔除 right 状态前 " + state);
state &= ~right;
System.out.println("剔除 right 状态后 " + state);
state &= ~top;
System.out.println("剔除不存在的 top 状态 " + state);
System.out.println();

是不是有点小激动了呢?哈哈,在安卓源码中运用挺多,举个栗子
android位运算简单讲解的更多相关文章
- Leetcode题目461:汉明距离(位运算-简单)
题目描述: 两个整数之间的汉明距离指的是这两个数字对应二进制位不同的位置的数目. 给出两个整数 x 和 y,计算它们之间的汉明距离. 注意:0 ≤ x, y < 231. 示例: 输入: x = ...
- C# 关于位运算的学习笔记
一.理解什么是位运算 程序中的所有内容在计算机内存中都是以二进制的形式储存的(即:0或1),简单来说位运算就是直接对在内存中的二进制数的每位进行运算操作. 二.学习前先了解一下有哪些运算,运算符都怎么 ...
- Java二进制和位运算,这一万字准能喂饱你
基础不牢,地动山摇.本文已被 https://www.yourbatman.cn 收录,里面一并有Spring技术栈.MyBatis.JVM.中间件等小而美的专栏供以免费学习.关注公众号[BAT的乌托 ...
- C#位运算讲解与示例
首先每一个权限数都是2的N次方数 如:k1=2 ; //添加 k2=4 ; //删除 k3=8; //修改 ... 如此定义功能权限数,当需要组合权限时,就需要对各个所拥有的权限数按位或了. 如: p ...
- 关于PHP位运算的简单权限设计
写在最前面 最近想写一个简单的关于权限处理的东西,之前我也了解过用二进制数的位运算可以出色地完成这个任务.关于二进制数 的位运算,常见的就是“或.与.非”这三种简单运算了,当然,我也查看了下PHP手册 ...
- Android事件总线分发库EventBus3.0的简单讲解与实践
Android事件总线分发库EventBus的简单讲解与实践 导语,EventBus大家应该不陌生,EventBus是一款针对Android优化的发布/订阅事件总线.主要功能是替代Intent,Han ...
- C#中缓存的使用 ajax请求基于restFul的WebApi(post、get、delete、put) 让 .NET 更方便的导入导出 Excel .net core api +swagger(一个简单的入门demo 使用codefirst+mysql) C# 位运算详解 c# 交错数组 c# 数组协变 C# 添加Excel表单控件(Form Controls) C#串口通信程序
C#中缓存的使用 缓存的概念及优缺点在这里就不多做介绍,主要介绍一下使用的方法. 1.在ASP.NET中页面缓存的使用方法简单,只需要在aspx页的顶部加上一句声明即可: <%@ Outp ...
- Java中的位运算及简单的算法应用介绍
众所周知,计算机底层是二进制.而java作为一门计算机编程语言,也对二进制的位运算提供了完整的支持. 在java中,int是32位的,也就是说可以用来实现32位的位运算.方便起见,我们一般用16进制对 ...
- C#位运算讲解与示例2
在C#中可以对整型运算对象按位进行逻辑运算.按位进行逻辑运算的意义是:依次取被运算对象的每个位,进行逻辑运算,每个位的逻辑运算结果是结果值的每个位.C#支持的位逻辑运算符如表2.9所示. 运算符号 意 ...
随机推荐
- Sql Server数据库性能优化之索引
最近在做SQL Server数据库性能优化,因此复习下一索引.视图.存储过程等知识点.本篇为索引篇,知识整理来源于互联网. 索引加快检索表中数据的方法,它对数据表中一个或者多个列的值进行结构排序,是数 ...
- 不可被忽视的操作系统( FreeRTOS )【1】
把大多数人每个星期的双休过过成了奢侈的节假日放假,把每天23点后定义为自己的自由时间,应该如何去思考这个问题 ? 双休的两天里,不!是放假的两天里,终于有较长的时间好好的学习一下一直断断续续的Free ...
- USACO07MAR Face The Right Way G 差分
题目链接 https://www.luogu.com.cn/problem/P2882 分析 这个题来看的话好像有点难下手,不如再去读一遍题 N遍,发现一句话很重要Each time the mach ...
- 分享一款一直在维护的【网络开发运维|通用调试工具】: http请求, websocket,cmd, RSA,DES, 参数签名工具,脚本批量生成工具,google动态口令,端口检测,组件注册,js混淆...
首先发下下载地址:https://files.cnblogs.com/files/taohuadaozhu/ConfigLab.Test.ex.rar 日常开发,运维,跨部门跨公司对接中. 想快速调 ...
- k8s + docker + Jenkins使用Pipeline部署SpringBoot项目时Jenkins错误集锦
背景 系统版本:CentOS7 Jenkins版本:2.222.1 maven版本:apache-maven-3.6.3 Java版本:jdk1.8.0_231 Git版本:1.8.3.1 docke ...
- Educational Codeforces Round 84 (Rated for Div. 2)
A. Sum of Odd Integers(思维) 思路 这一题看完ans之后觉得是真简单,不过有一些地方还是要理解的. 这一题输出YES,有两个条件 kk%2 == n%2k,这个条件的意思是 k ...
- HTML、PHP、CSS、JS之间的关系
23:02:06 2019-08-05 自己要搭建网站 虽然可以下载大佬的界面 但至少要懂一点web开发的知识 我现在感觉像个憨憨 啥都不明白 转载自:知乎 https://www.zhihu.com ...
- jsjsjs
var TooL = {}; (function(t){ function common(){ console.log("common"); } var a = function( ...
- Django ORM操作数据库常用API
昨天晚上,我们完成了一个简单的实例来对数据库表进行操作.今天,我们要熟悉更多的API,实现更复杂的功能.这一步完成了,我们对小型数据的操作问题也就不大了. 现在,我们还是参考django官方文档,来进 ...
- Markdown自动生成目录
Markdown自动生成目录 使用npm语法生成 1.安装npm 2.安装doctoc插件 3.执行生成 参考 Markdown自动生成目录 使用npm语法生成 1.安装npm 我的系统是deepin ...