如果要搞懂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位运算符&、|、^、>>、<<、~、>>>的更多相关文章

  1. Java 位运算符和 int 类型的实现

    Java 位运算符和 int 类型的实现 其他运算符 # 算术运算符 +.-.*./.++i.i++.--i.i-- # 关系运算符 ==.!=.>.<.>=.<= # 逻辑运 ...

  2. 利用Java位运算符,完成Unsigned转换(无符号)

    方案二:利用Java位运算符,完成Unsigned转换. 正常情况下,Java提供的数据类型是有符号signed类型的,可以通过位运算的方式得到它们相对应的无符号值,参见几个方法中的代码: publi ...

  3. 【java提高】(17)---Java 位运算符

    Java 位运算符 &.|.^.~.<<.>> 以前学过有关java的运算符,不过开发了这么久也很少用过这个.现在由于开发需要,所以现在再来回顾整理下有关java的运算 ...

  4. LeetCode刷题笔记(3)Java位运算符与使用按位异或(进制之间的转换)

    1.问题描述 给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次.找出那个只出现了一次的元素. 算法应该具有线性时间复杂度并且不使用额外空间. 输入: [4,1,2,1,2] 输 ...

  5. Java位运算符、位移运算符;原码、反码、补码

    文章背景:雪花算法 id 生成长度问题. Java位运算符 - 异或运算符(^)<p>运算规则:两个数转为二进制,然后从高位开始比较,如果相同则为0,不相同则为1.</p> - ...

  6. 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 ...

  7. Java位运算符浅析

    在学习源码中,发现有大量使用位运算符,这样做的目的是为了节约内存开销和加快计算效率. 位运算符,这个”位”代表这什么? 位:二进制位简称“位”,是二进制记数系统中表示小于2的整数的符号,一般用1或 0 ...

  8. (九)java位运算符

    位运算符 &(与),|(或),^(异或),~(取反),<<(左移),>>(右移),>>>(无符号右移)         1:为true,0为false ...

  9. Java 位运算符 &、|、^、~、<<、>>、>>>

      撸了N久的代码,但是突然冒出来个位运算,我就蒙蔽了,这是什么?我是谁?我在干什么?我在哪? 1)闲扯 关于位运算符无非也就 与(&).或(|).异或(^).取反(~).左移(<< ...

随机推荐

  1. Okhttp3源码解析(5)-拦截器RetryAndFollowUpInterceptor

    ### 前言 回顾: [Okhttp的基本用法](https://www.jianshu.com/p/8e404d9c160f) [Okhttp3源码解析(1)-OkHttpClient分析](htt ...

  2. HDU 6242

    题意略. 思路:这个题的思路非常诡异.由于题目保证存在这样一个圆,那么每个点在这个圆上的概率是1/2,我任选3个点,这3个点都在这个圆上的概率是1 / 8. 不都在这个圆上的概率是7 / 8,在这样选 ...

  3. 一位996、CRUD开发者的一天

    记一笔流水账 今天我打算记一笔流水账,主要记录我的一天中干的事情,并思考效率低下的原因,同时分析一些可用的解决方案. 清早·开始做计划 早上六点四十,被梦想唤醒,然后看一会书,吃早餐,送娃上学. 九点 ...

  4. A-The power of Fibonacci_2019牛客暑期多校训练营(第九场)

    题意 求\(\sum_0^n{Fb}_i^m \mod (1e9)\) 题解 模1e9时的斐波那契数列循环节太大,考虑把模数质因数分解成\(2^9\cdot5^9\),此时循环节变成768和78125 ...

  5. CF1097D Makoto and a Blackboard 质因数分解 DP

    Hello 2019 D 题意: 给定一个n,每次随机把n换成它的因数,问经过k次操作,最终的结果的期望. 思路: 一个数可以表示为质数的幂次的积.所以对于这个数,我们可以分别讨论他的质因子的情况. ...

  6. HDU 6364 Ringland

    Ringland 题意: 在一个环上有n个男生, n个女生, 现在要求每一个男生与女生配对, 求总代价最小. 题解: 如果2个男生到女生的路交叉了, 那么我们交换这2个男生的路, 总代价是一定会变得小 ...

  7. poj3984 迷宫问题(简单的输出路径的bfs)

    题目链接 http://poj.org/problem?id=3984 中文题题意不解释了 反正就是简单的结构体套结构体存一下路径就行了 #include <iostream> #incl ...

  8. codeforces 805 D. Minimum number of steps(数学)

    题目链接:http://codeforces.com/contest/805/problem/D 题意:只有一个操作就是将ab变成bba直到不能变为止,问最少边几次. 题解:这题可以多列几组来找规律, ...

  9. 入门MySQL——备份与恢复

    前言:  前面几篇文章为大家介绍了 MySQL 各种语句语法的用法及用户权限相关知识.本篇文章将主要讲解 MySQL 数据库数据备份与恢复相关知识,主要聚焦于逻辑备份,介绍mysqldump工具的使用 ...

  10. 【原创】(三)Linux paging_init解析

    背景 Read the fucking source code! --By 鲁迅 A picture is worth a thousand words. --By 高尔基 说明: Kernel版本: ...