一、前言

在查看源码中,经常会看到很多这样的符号“&”、“|”、“~”,咋一看挺高大上;仔细一看,有点懵;再看看,其实就是大学学过的再普通不过的与、或、非。今天小盆友就以简单的形式分享下,同时也是作为笔记记录,等某天突然懵逼时可以回来看看,话不多说,开始撸。

二、与或非是啥?

或许,大学上的课,在还没毕业时就还给老师了,所以我们先重温下。

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,这里不是计算机出问题了,而是涉及到了计算机内部的编码的问题,是不是想到了大学有一门课叫做《计算机科学导论》。详细讲解可以查看这里=>传送门为了方便查看,我从文章截了一张图

image

三、实战

逼逼叨了这么多,其实位运算符的文章很多,这里其实还少了一个异或运算符,但因为没有出现在实战中,所以就不做多余的操作了。我们来进行真正的运用吧。

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位运算简单讲解相关推荐

  1. c语言位运算负数的实例_一招教你学会C语言中位运算

    程序中的所有数在计算机内存中都是以二进制的形式储存的.位运算说穿了,就是直接对整数在内存中的二进制位进行操作.注意,位运算只针对于整数进行操作. 运算符号 运算规则 1.&与运算:对应两个二进 ...

  2. SQL位运算查询 - ‘‘ 举例

    需求举例: 某动物园对动物的投喂有以下规定:      苹果可以去投喂鹿.猴子.熊猫      竹子可以去投喂熊猫.竹鼠      树叶可以去投喂兔子.鹿 现在饲养员携带苹果.树叶,他可以投喂哪些动物 ...

  3. LeetCode 136. Single Number【哈希表/位运算/数学】简单

    本文属于「征服LeetCode」系列文章之一,这一系列正式开始于2021/08/12.由于LeetCode上部分题目有锁,本系列将至少持续到刷完所有无锁题之日为止:由于LeetCode还在不断地创建新 ...

  4. bnuoj 1065 简单的问题(位运算)

    简单的问题 Time Limit: 1000ms Case Time Limit: 1000ms Memory Limit: 65536KB 算法的渐进时间复杂度是算法的运行时间的一种度量方式,通常用 ...

  5. python写整数逆位运算_简单了解python的一些位运算技巧

    前言 位运算的性能大家想必是清楚的,效率绝对高.相信爱好源码的同学,在学习阅读源码的过程中会发现不少源码使用了位运算.但是为啥在实际编程过程中应用少呢?想必最大的原因,是较为难懂.不过,在面试的过程中 ...

  6. NKU两题简单题解析(递归分析与位运算技巧)

    题目:http://acm.nankai.edu.cn/p1002.html 题意:对给定的f(n),当 n>=50025002 的时候,f(n)=n-5:当 n<50025002 的时候 ...

  7. 超简单的位运算---再也不用担心看不懂题解了

    超简单的位运算---再也不用担心看不懂题解了 写在前面 1.原码.反码与补码------整形在计算机中的储存 2.移位操作符 3.位操作符 4.小练手 写在最后 写在前面 大家好,这里是风扇的小小笔记 ...

  8. Java实现 字符串加密 输入字符串进行简单的位运算,输出加密或解密后的字符串

    Java实现 字符串加密 输入字符串进行简单的位运算,输出加密或解密后的字符串 具体代码如下: package package2;import java.util.Scanner;/*** 加密可以这 ...

  9. UVALive 3351 Easy and Not Easy Sudoku Puzzles 位运算~判断简单数独

    题意:给定一个9*9的数独,要求判断是否为简单数独. 数独:对于每一行每一列或者子方格内,只能填1~9这几个数,并且每个数字只能出现一次,比如说: 如果一个9*9的数独是简单数独的话,这个数独的解是独 ...

最新文章

  1. 移动广告聚合管理-KeyMob|移动广告聚合平台|
  2. wxpython多个面板_wxpython:隐藏其中一个拆分窗口面板
  3. OpenCV2:应用篇 QT+OpenCV实现图片编辑器
  4. caffe 练习1:training LeNet on MNIST with Caffe/ 用LeNet识别手写字符集 Mnist------by 香蕉麦乐迪
  5. JQuery之ajax异步请求Django后端
  6. 基本数据与引用数据类型参数传递
  7. mysql使用技巧_MySQL使用不得不看的几个小技巧
  8. 【转】PHP会话Session使用详解
  9. Apple设备的列表中的手机却不能更新iOS 14怎么办
  10. “卖键盘的被键盘侠喷了” | 社交网络的戾气怎么这么重
  11. 动态规划实战6 leetcode-139. Word Break
  12. 实验四 数据选择器及其应用
  13. K3 Cloud 数据库查询表常用语句
  14. Java 同环比计算相关逻辑
  15. 如何快速部署企业私有云存储
  16. STATA 和 SAS 输入输出示范
  17. 30天自制操作系统 第一天
  18. PHP输出一段励志的话,至自己励志的一段话 鼓励拼搏的句子
  19. 小程序中使用echarts
  20. 基于Arduino开发板实现触摸式开关

热门文章

  1. Django 学习第十一天——中间键和上下文处理器
  2. Java——BigInteger类和BigDecimal类
  3. 常用作图与图片处理工具
  4. 【C#日期系列(一)】--C#获取某月第一天0分0秒以及最后一天59分59秒
  5. node.js搭建简单服务器,用于前端测试websocket链接方法和性能测试
  6. jvm简单笔记(3)
  7. LinkServer--服务器选项
  8. OpenGL Vertex Array
  9. JavaScript 入门基础 (八)
  10. m.soudashi.cn 地图_SEO人员怎样挖掘大量关键词库