Java位运算符&、|、^、>>、<<、~、>>>
如果要搞懂Java中的位运算符,首先要搞懂二进制的运算,之前一篇有介绍详细请看 二进制运算-十进制与二进制的转换
Java中的位运算符有:&(按位与)、|(按位或)、^(按位异或)、>>(右移)、<<(左移)、~(取反)、>>>(无符号右移)
下面来逐一介绍:
&(按位与)
int i = 5&2;
int j = 7&3;
System.out.println("i="+i);//i=0
System.out.println("j="+j);//j=3
按位与的运算规则是先将两边转换为二进制,再计算最终值,运算规则“逢0变0”,即1&1=1,1&0=0,0&1=0,0&0=0
5的二进制101,2的二进制10,5&2即为101&10,不足位补0,101&010,根据运算规则得出最终值0,十进制也是0
7的二进制111,3的二进制11,7&3即为111&011,根据运算规则得出最终值011,转换为十进制就是3
|(按位或)
int i = 6|2;
int j = 5|3;
System.out.println("i="+i);//i=6
System.out.println("j="+j);//j=7
按位或的运算规则是先将两边转换为二进制,运算规则“逢1变1”,即1|1=1,1|0=1,0|1=1,0|0=0
6的二进制110,2的二进制10,6|2即为110|010,根据运算规则得出最终值110,十进制就是6
5的二进制101,3的二进制11,5|3即为101|011,根据运算规则得出最终值111,十进制就是
^(按位异或)
int i = 7^3;
int j = 5^2;
System.out.println("i="+i);//i=4
System.out.println("j="+j);//j=7
按位异或,顾名思义数位上不一样即为1,其运算规则为1^1=0,1^0=1,0^1=1,0^0=0
7的二进制111,3的二进制11,7^3等同于111&011,根据运算规则结果100,十进制4
5的二进制101,2的二进制10,5^2等同于101^010,结果111,十进制7
<<(左移)
int i = 2<<3;
int j = 5<<2;
System.out.println("i="+i);//i=16
System.out.println("j="+j);//j=20
左移就是数值二进制的有效值往左移,移的位数就是“<<”符号右边的值,2<<3就是2的二进制的有效值往左移3位,右边补0
2的二进制0000 0010,左移3位为0001 0000,十进制为16
5的二进制0000 0101,左移2位为0001 0100,十进制为20
>>(右移)
int i = 9>>2;
int j = 15>>3;
System.out.println("i="+i);//i=2
System.out.println("j="+j);//j=1
右移跟左移是相反的,右移就是往右边移N位,正数左边补0,负数左边补1
9的二进制0000 1001,右移2位,0000 0010,十进制2
15的二进制0000 1111,右移3位,0000 0001,十进制1
~(取反)
int i = ~5;
int j = ~8;
System.out.println("i="+i);//i= -6
System.out.println("j="+j);//j= -9
取反就是转为二进制之后1为0,0为1
5的二进制0000 0000 0000 0000 0000 0000 0000 0101,取反1111 1111 1111 1111 1111 1111 1111 1010,反码的值十进制为-6
其实还有一种更好理解的方式,想象一杆数轴,以0和-1的中间点为中心点对折同位置重叠的即为取反的值,简单的说取反就是相反数减一
>>>(无符号右移)
int i = 5>>>2;
int j = -5>>>2;
System.out.println("i="+i);//i= 1
System.out.println("j="+j);//j= 1073741822
无符号右移在正数的计算和右移是没有区别的,区别在于负数的计算
-5的二进制为1111 1111 1111 1111 1111 1111 1111 1011(负数的转换方式之前已经讲过了),右移两位00 1111 1111 1111 1111 1111 1111 1111 10,左边补0,而在>>中左边补1
>>:有符号右移运算,若参与运算的数字为正,则在高位补0,若为负则在左边高位补1
>>>:无符号右移运算,无论参与运算的数字为正数还是负数,都在左边高位补0
Java位运算符&、|、^、>>、<<、~、>>>的更多相关文章
- Java 位运算符和 int 类型的实现
Java 位运算符和 int 类型的实现 其他运算符 # 算术运算符 +.-.*./.++i.i++.--i.i-- # 关系运算符 ==.!=.>.<.>=.<= # 逻辑运 ...
- 利用Java位运算符,完成Unsigned转换(无符号)
方案二:利用Java位运算符,完成Unsigned转换. 正常情况下,Java提供的数据类型是有符号signed类型的,可以通过位运算的方式得到它们相对应的无符号值,参见几个方法中的代码: publi ...
- 【java提高】(17)---Java 位运算符
Java 位运算符 &.|.^.~.<<.>> 以前学过有关java的运算符,不过开发了这么久也很少用过这个.现在由于开发需要,所以现在再来回顾整理下有关java的运算 ...
- LeetCode刷题笔记(3)Java位运算符与使用按位异或(进制之间的转换)
1.问题描述 给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次.找出那个只出现了一次的元素. 算法应该具有线性时间复杂度并且不使用额外空间. 输入: [4,1,2,1,2] 输 ...
- Java位运算符、位移运算符;原码、反码、补码
文章背景:雪花算法 id 生成长度问题. Java位运算符 - 异或运算符(^)<p>运算规则:两个数转为二进制,然后从高位开始比较,如果相同则为0,不相同则为1.</p> - ...
- java 位运算符 以及加法 交换两个变量值
先给出十转二的除法 2 60 30 0 15 0 7 1 3 1 1 1 0 1 60转二 111100 再介绍位运算符 a=60 b=13 A = 0011 1100 B ...
- Java位运算符浅析
在学习源码中,发现有大量使用位运算符,这样做的目的是为了节约内存开销和加快计算效率. 位运算符,这个”位”代表这什么? 位:二进制位简称“位”,是二进制记数系统中表示小于2的整数的符号,一般用1或 0 ...
- (九)java位运算符
位运算符 &(与),|(或),^(异或),~(取反),<<(左移),>>(右移),>>>(无符号右移) 1:为true,0为false ...
- Java 位运算符 &、|、^、~、<<、>>、>>>
撸了N久的代码,但是突然冒出来个位运算,我就蒙蔽了,这是什么?我是谁?我在干什么?我在哪? 1)闲扯 关于位运算符无非也就 与(&).或(|).异或(^).取反(~).左移(<< ...
随机推荐
- java 程序执行顺序之继承
1.首先会初始化父类,因为没有父类子类也无从谈起.第一步初始化static 变量 或者 静态初始化话块 2.初始化子类的static 变量 或者 静态初始化块 3.顺序初始化父类普通变量 或者 父类普 ...
- 基于python的mysql复制工具
一简介 python-mysql-replication 是由python实现的 MySQL复制协议工具,我们可以用它来解析binlog 获取日志的insert,update,delete等事件 ,并 ...
- 玩转 SpringBoot 2 快速搭建 | IntellJ IDEA篇
IntellJ IDEA 介绍 IntelliJ IDEA 简称 IDEA,目前被认为是最好用的开发Java 语言开发工具之一.不过是收费的.和其同类型的工具有 Eclipse 和 MyEclip ...
- 使用react定义组件的两种方式
react组件的两种方式:函数定义,类定义 在定义一个组件之前,首先要明白一点:react元素(jsx)是react组件的最基本的组成单位 组件要求: 1,为了和react元素进行区分,组件名字首必须 ...
- CodeForces 909E
题意略. 思路:一个拓扑排序的题目吧.肯定是要先处理后面那个任务,再处理前面那个任务,我的思路是尽力先把主处理器能操作的先操作完,然后再把副处理器能操作完的再操作完,这样循环,直到处理完全部. 定义t ...
- CocosBuilder 学习笔记(3) AnimationManager 与 ccbi 文件解析
[CocosBuilder]学习笔记目录 1. 相关的类 先介绍和AnimationManager相关的几个类: CCBSequence 时间线.有成员duration(时间线时间,默认10秒).na ...
- Python处理NetCDF格式数据为TIFF数据(附脚本代码)
博客小序:NetCDF格式数据广泛应用于科学数据的存储,最近几日自己利用python处理了一些NetCDF数据,特撰此博文以记之. 参考博客: https://www.cnblogs.com/shou ...
- JPA多条件复杂SQL动态分页查询
概述 ORM映射为我们带来便利的同时,也失去了较大灵活性,如果SQL较复杂,要进行动态查询,那必定是一件头疼的事情(也可能是lz还没发现好的方法),记录下自己用的三种复杂查询方式. 环境 spring ...
- 2019 Multi-University Training Contest 4
A. AND Minimum Spanning Tree solved by rdc 21min -1 数组开小了,解体了一次. 题意 给一棵树,两点之间边权为 x & y,求最小生成树. 做 ...
- ccpc网赛 hdu6703 array(权值线段树
http://acm.hdu.edu.cn/showproblem.php?pid=6703 大意:给一个n个元素的数组,其中所有元素都是不重复的[1,n]. 两种操作: 将pos位置元素+1e7 查 ...