目录

一、<< :左移运算符

二、>> :右移运算符

三、>>> :无符号右移

四、& :与运算

五、| :或运算

六、~ :非运算

七、^ :异或运算

拓展问题:

一:从计算速度上讲,移位运算要比算术运算快?

二:二进制的起源

日常发车:


参考文章:
https://blog.csdn.net/is_zhoufeng/article/details/8112199

一、<< :左移运算符

说明:将运算符左边的对象向左移动运算符右边指定的位数(在低位补0)
通俗含义:num << 1,相当于num乘以2,依次数字递增,乘以2的平方(不严谨)

例如:

2 << 1 //4 移了一位2*2

2 << 2 //8 移了两位 2*2*2

2 << 3 //16 移了三位 2*2*2*2

二、>> :右移运算符

说明:如果值为正,则在高位补0,如果值为负,则在高位补1.
通俗含义:num >> 1,相当于num除以2,依次数字递增,除以2的平方(不严谨)

例如:

16 >> 1 //8 移了一位 16/2

16 >> 2 //4 移了两位 16/2/2

16 >> 3 //2 移了三位 16/2/2/2

三、>>> :无符号右移

说明:忽略符号位,高位都以0补齐
含义:无符号右移运算符>>>  结果总是正数或者0

为什么只对正数有意义,对负数没有什么算术意义,只有逻辑意义:
因为如果一个数位负数,按照现实中数学常识,除以或乘一个负数都是负数,但在程序中都是正数显示

为什么只是对32位和64位的值有意义 ?
例如:

System.out.println(-1024 >> 4); //-64System.out.println(-1024 >>> 4); //268435392System.out.println(1024 >>> 24); //0

引申:
与(&)、非(~)、或(|)、 从电路的角度理解

“门”是这样的一种电路:它规定各个输入信号之间满足某种逻辑关系时,才有信号输出。
从逻辑关系看,门电路的输入端或输出端只有两种状态,无信号以“0”表示,有信号以“1”表示。

产生:通常有下列三种门电路:与门、或门、非门(反相器)

0为假,1为真     =====》
true ——> 1
false ——> 0

四、& :与运算

说明;符号两边都为true,结果才是true,否则为false;对于数字,可将数字转换为2进制形式去理解,采用同位 与 操作即可得出结果。
联想:在与运算中两个开关是串联的,如果我们要开灯,需要两个开关都打开灯才会打开。

例如:

true&true=true

true&false=false

false&false=false

2&3=2 即:0010&0011=0010 (从高位到低位,依次做与操作)

五、| :或运算

说明:符号两边只有有一个为true,则结果为true,否则为false;对于数字,可将数字转换为2进制形式去理解,采用同位 或 操作即可得出结果。
联想:在或运算中两个开关是并联的,即一个开关开,则灯开。

例如:

true|true=true

true|false=true

false|true=true

false|false=false

2|3=3 即:0010|0011=0011 (从高位到低位,依次做或操作)

六、~ :非运算

联想:非门输出与输入相反,即取反运算

例如:


!true=false!false=trueSystem.out.println(~2);//-3System.out.println(~-2);//1

七、^ :异或运算

说明:相同为0,不同为1;对于数字,可将数字转换为2进制形式去理解,采用同位 异或 操作即可得出结果。
含义:异或是一种基于二进制的位运算,用符号XOR或者 ^ 表示,其运算法则是对运算符两侧数的每一个二进制位,同值取0,异值取1。

重要性质:
自反性:A XOR B XOR B = A xor  0 = A
即对给定的数A,用同样的运算因子(B)作两次异或运算后仍得到A本身

不进位加法:如1+1=0,,0+0=0,1+0=1。

实际应用:
利用自反性,可以获得许多有趣的应用。 例如,所有的程序教科书都会向初学者指出,要交换两个变量的值,必须要引入一个中间变量。但如果使用异或,就可以节约一个变量的存储空间: 设有A,B两个变量,存储的值分别为a,b,则以下三行表达式将互换他们的值 表达式 (值) :

A=A XOR B (a XOR b)

B=B XOR A (b XOR a XOR b = a)

A=A XOR B (a XOR b XOR a = b)

类似地,该运算还可以应用在加密,数据传输,校验等等许多领域。

常规测试:

2^3=1,即0010^0011=0001

true^true=false

false^false=false

true^false=true

5^2=7 即:0101^0010=0111 (从高位到低位,依次做异或操作)

拓展问题:

一:从计算速度上讲,移位运算要比算术运算快?

参考:https://blog.csdn.net/fyilun/article/details/45168253

CPU角度:
因为移位指令占2个机器周期,而乘除法指令占4个机器周期。

因为移位指令不需要涉及到逻辑运算.

常规一条指令被拆分的步骤
IF    ID    EX    MEM     WB UP
取指、译码、执行、访存、写回、更新

移位指令:取指 、写回(写)
乘除法指令:取指、译码、执行、写回(一次逻辑运算和一次写)

从硬件上看,移位对硬件更容易实现,所以会用移位,移一位就乘2,这种乘法当然考虑移位了。

实际应用角度,JVM的自主优化:
对于乘法和以及%运算,JVM一定会优化,这些是不需要程序员去考虑的,直接去用*/%即可。
对于除法,因为上述问题,确实是位移更快些。不过通常还是考虑使用位运算:
例如JVM源码:

java.util.Arrays.binarySearch:int low = fromIndex;
int high = toIndex - 1;while (low <= high) {int mid = (low + high) >>> 1;int midVal = a[mid];if (midVal < key)low = mid + 1;else if (midVal > key)high = mid - 1;elsereturn mid; // key found
}
return -(low + 1);  // key not found.

解析:(low + high) >>> 1代替(low + high) /2是非常正确的,首先是因为数组下标肯定不会是负数,另一方面如果low + high大于int最大值(溢出变为负数了)时,只有>>>1能保证结果正确。

二:二进制的起源

中国的《易经》以爻、卦来表示天地和万物,其中爻是最基本的元素,爻分阴爻(用“--”表示)和阳爻(用“—”表示)两种,阴爻和阳爻的不同排列就是卦象,一个卦象称为一卦,一卦由六爻组成一卦就是一个整体。

世界万物中最基本的要素有8种,分别是天、地、雷、风、水、火、山和泽,他们分别用八卦表示,即乾、坤、震、坎、离、艮、兑,八卦互相搭配又得六十四卦,用来表示各种自然现象和人事现象。

我们对比二进制的组成:二进制的位用0,1表示,3位二进制可组合成8种状态,即可表示为0,1,...,7这8个数,而2个3位二进制组合,即变为6位二进制数,即:2=64,即64种状态。

莱布尼兹是第一个认识到二进制记数法重要性的人,并系统地提出了二进制数的运算法则。二进制对200多年后计算机的发展产生了深远的影响。他于1716年发表了《论中国的哲学》一文,
还设计了一台可以完成数码计算的机器。并进行了二进制的推广。

参考:
https://zhidao.baidu.com/question/1177745006240062179.html

联想到
我们为什么使用二进制去作为基本元素?

核心:两个状态的系统容易实现 、运算法则简单、可进行逻辑运算。

运算规则简单:节省设备。人们知道,具有两种稳定状态的元件(如晶体管的导通和截止,继电器的接通和断开,电脉冲电平的高低等)容易找到,而要找到具有10种稳定状态的元件来对应十进制的10个数就困难了

适合逻辑运算:逻辑代数是逻辑运算的理论依据,二进制只有两个数码,正好与逻辑代数中的“真”和“假”相吻合

容易实现:二进制在物理上最易实现存储,通过磁极的取向、表面的凹凸、光照的有无等来记录。

日常发车:

程序员的工作是相对孤独的,如何平衡呢?看下图:

图片等

Java 移位、逻辑运算符详解(~史上最全|吹牛逼)相关推荐

  1. YUV 格式详解-史上最全

    YUV 格式详解 介绍 分类标准 具体分类 I420(属于 YUV 420 Plannar) YV12(属于 YUV 420 Plannar) NV12(属于 YUV 420 Semi-Planar) ...

  2. 【思维导图】富士相机的胶片模拟详解 史上最全资料汇总

    参考资料 当富士X-T4遇上X-Pro3[值不值得买第431期] https://www.bilibili.com/video/BV1oV411C7hJ,http://forum.xitek.com/ ...

  3. string所有函数详解——史上最全,最贴心

    简介 区别于#include<string.h>头文件,#include<string>头文件中的函数专门用于处理C++中string字符串.而前者是用来处理C语言中char数 ...

  4. 我的世界刷猪人塔java版_我的世界速攻猪人塔详解 史上最牛的经验塔

    我的世界速攻猪人塔详解 史上最牛的经验塔.那下面给大家分享的这个是一个可以让所有经验塔自叹不如的速攻猪人塔哦~那到底这个塔是什么呢?那下面就给大家详细的介绍一下吧!有感兴趣的玩家不妨进来看看哦~希望大 ...

  5. Java NIO (图解+秒懂+史上最全)

    文章很长,建议收藏起来,慢慢读! Java 高并发 发烧友社群:疯狂创客圈 奉上以下珍贵的学习资源: 免费赠送 经典图书:<Java高并发核心编程(卷1)> 面试必备 + 大厂必备 +涨薪 ...

  6. Java Math类方法介绍之史上最全

    Java Math类方法介绍之史上最全 开发中用到了Java Math类的方法,故温习记录如下. /*** 常量*/System.out.println("------>" ...

  7. 5W字高质量java并发系列详解教程(上)-附PDF下载

    文章目录 第一章 java.util.concurrent简介 主要的组件 Executor ExecutorService ScheduledExecutorService Future Count ...

  8. java spring框架 注解_史上最全的java spring注解

    史上最全的java spring注解,没有之一 注解是个好东西,但好东西我们也是看见过,整理过,理解过,用过才知道好.不求我们每个都记住,但求保有印象,在需要的时候能提取出来再查找相关资料,平时工作就 ...

  9. 一文带你看懂JAVA IO流(一),史上最全面的IO教学啦(附送JAVA IO脑图)

    一.IO流是什么 惯例引用百科的回答 流是一种抽象概念,它代表了数据的无结构化传递.按照流的方式进行输入输出,数据被当成无结构的字节序或字符序列.从流中取得数据的操作称为提取操作,而向流中添加数据的操 ...

最新文章

  1. NeurIPS 2020不用抢票了!官方宣布改线上举办,网友:nice!已白嫖3个顶会
  2. 使用@Controller注解为什么要配置mvc:annotation-driven /
  3. 计算机软考高级论文,【2019年软考高项论文一定要避开这些坑】- 环球网校
  4. OpenStack Nova 计算节点的维护模式
  5. java filechannel 空_FileChannel的基本操作
  6. 大润发优鲜app之paramsMD5参数分析
  7. ps字体识别_秒抠毛发,去除海报字体……解锁PS的3个隐藏工具
  8. 使用Apache NFOP创建pdf
  9. 凸包练习: POJ 2187(JAVA)
  10. 企业邮件系统搭建-关于不能往yahoo,sina,hotmail地址发邮件的问题一
  11. pygame安装超详细讲解
  12. 谷歌浏览器翻译显示服务器失败,谷歌浏览器翻译失败怎么办
  13. flask+gunicorn部署
  14. Win10新加内存条后可用内存没增加解决方案
  15. EMC学习之电磁辐射
  16. 【Java系列】聊天室开发
  17. 四川省教育考试院计算机准考证打印,四川省教育考试网官网准考证打印
  18. 人工智能火爆 国内这几家计算机视觉公司值得关注
  19. Java后端面试(五)
  20. ChemDraw绘制苯甲酸钠的生成反应式的方法

热门文章

  1. windows10下文件被占用,不能删除
  2. Amy Palladino 加入 BCW,担任企业运作执行副总裁兼董事总经理
  3. ​Word文档的隐藏功能​
  4. 从本地管理员到域管理员提权
  5. 训练人物和摩托车的yolov4-tiny模型教程
  6. 软件开发2:代码检视
  7. CSSAPP 稀里糊涂的的读书笔记目录
  8. 稀里糊涂的解决了 cuda 和cudnn的安装以及conda安装pytorch出现的torch.cuda.is_available()为false的问题
  9. 一枚笑脸 emoji,估值 20 亿美元!这个开源项目有点强...
  10. 从平民到帝皇——给企业主的启示