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();
是不是有点小激动了呢?哈哈,在安卓源码中运用挺多,举个栗子?,在ViewGroup中的requestDisallowInterceptTouchEvent方法便有用到,这里就不一一列举。
敲黑板啦!!! 为什么上面能做到剔除呢?小盆友手写了下过程(多年没写字,不要喷,哈哈哈哈)
四、小结
- 或运算符整合值
- 与运算符取值
- 与非剔除值
五、写在最后
或许还有很多更好玩的用法,但限于小盆友能力有限,文笔也一般般,所以就只能到这啦。如果您有更好或是更有趣的用法,或是本文有不妥之处,请与分享和纠正。编码使我快乐,哈哈哈。
链接:https://www.jianshu.com/p/5f41b3cc1909
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。
转载于:https://www.cnblogs.com/wangzehuaw/p/9962398.html
android位运算简单讲解相关推荐
- c语言位运算负数的实例_一招教你学会C语言中位运算
程序中的所有数在计算机内存中都是以二进制的形式储存的.位运算说穿了,就是直接对整数在内存中的二进制位进行操作.注意,位运算只针对于整数进行操作. 运算符号 运算规则 1.&与运算:对应两个二进 ...
- SQL位运算查询 - ‘‘ 举例
需求举例: 某动物园对动物的投喂有以下规定: 苹果可以去投喂鹿.猴子.熊猫 竹子可以去投喂熊猫.竹鼠 树叶可以去投喂兔子.鹿 现在饲养员携带苹果.树叶,他可以投喂哪些动物 ...
- LeetCode 136. Single Number【哈希表/位运算/数学】简单
本文属于「征服LeetCode」系列文章之一,这一系列正式开始于2021/08/12.由于LeetCode上部分题目有锁,本系列将至少持续到刷完所有无锁题之日为止:由于LeetCode还在不断地创建新 ...
- bnuoj 1065 简单的问题(位运算)
简单的问题 Time Limit: 1000ms Case Time Limit: 1000ms Memory Limit: 65536KB 算法的渐进时间复杂度是算法的运行时间的一种度量方式,通常用 ...
- python写整数逆位运算_简单了解python的一些位运算技巧
前言 位运算的性能大家想必是清楚的,效率绝对高.相信爱好源码的同学,在学习阅读源码的过程中会发现不少源码使用了位运算.但是为啥在实际编程过程中应用少呢?想必最大的原因,是较为难懂.不过,在面试的过程中 ...
- NKU两题简单题解析(递归分析与位运算技巧)
题目:http://acm.nankai.edu.cn/p1002.html 题意:对给定的f(n),当 n>=50025002 的时候,f(n)=n-5:当 n<50025002 的时候 ...
- 超简单的位运算---再也不用担心看不懂题解了
超简单的位运算---再也不用担心看不懂题解了 写在前面 1.原码.反码与补码------整形在计算机中的储存 2.移位操作符 3.位操作符 4.小练手 写在最后 写在前面 大家好,这里是风扇的小小笔记 ...
- Java实现 字符串加密 输入字符串进行简单的位运算,输出加密或解密后的字符串
Java实现 字符串加密 输入字符串进行简单的位运算,输出加密或解密后的字符串 具体代码如下: package package2;import java.util.Scanner;/*** 加密可以这 ...
- UVALive 3351 Easy and Not Easy Sudoku Puzzles 位运算~判断简单数独
题意:给定一个9*9的数独,要求判断是否为简单数独. 数独:对于每一行每一列或者子方格内,只能填1~9这几个数,并且每个数字只能出现一次,比如说: 如果一个9*9的数独是简单数独的话,这个数独的解是独 ...
最新文章
- 移动广告聚合管理-KeyMob|移动广告聚合平台|
- wxpython多个面板_wxpython:隐藏其中一个拆分窗口面板
- OpenCV2:应用篇 QT+OpenCV实现图片编辑器
- caffe 练习1:training LeNet on MNIST with Caffe/ 用LeNet识别手写字符集 Mnist------by 香蕉麦乐迪
- JQuery之ajax异步请求Django后端
- 基本数据与引用数据类型参数传递
- mysql使用技巧_MySQL使用不得不看的几个小技巧
- 【转】PHP会话Session使用详解
- Apple设备的列表中的手机却不能更新iOS 14怎么办
- “卖键盘的被键盘侠喷了” | 社交网络的戾气怎么这么重
- 动态规划实战6 leetcode-139. Word Break
- 实验四 数据选择器及其应用
- K3 Cloud 数据库查询表常用语句
- Java 同环比计算相关逻辑
- 如何快速部署企业私有云存储
- STATA 和 SAS 输入输出示范
- 30天自制操作系统 第一天
- PHP输出一段励志的话,至自己励志的一段话 鼓励拼搏的句子
- 小程序中使用echarts
- 基于Arduino开发板实现触摸式开关
热门文章
- Django 学习第十一天——中间键和上下文处理器
- Java——BigInteger类和BigDecimal类
- 常用作图与图片处理工具
- 【C#日期系列(一)】--C#获取某月第一天0分0秒以及最后一天59分59秒
- node.js搭建简单服务器,用于前端测试websocket链接方法和性能测试
- jvm简单笔记(3)
- LinkServer--服务器选项
- OpenGL Vertex Array
- JavaScript 入门基础 (八)
- m.soudashi.cn 地图_SEO人员怎样挖掘大量关键词库