位运算符

java支持的位运算符有7个,分为两类:位逻辑运算和移位运算。位逻辑运算符包括按位取反(~)、按位与(&)、按位或(|)和按位异或(^)4种,。移位运算符包括左移(<<)、右移(>>)和无符号右移(>>>)3种。位运算符只能用于整型数据,包括byte、short、int、long和char类型。下表列出了各种位运算符的功能与示例。假设a = 10, b = 3。

~运算符是对运算数的每一位按位取反。

下表列出了位运算符的基本运算,假设整数变量A的值为60和变量B的值为13:

操作符 描述 例子
& 如果相对应位都是1,则结果为1,否则为0 A & B得到12,即0000 1100
| 如果相对应位都是0,则结果为0,否则为1 A | B得到61,即 0011 1101
^ 如果相对应位值相同,则结果为0,否则为1 A ^ B得到49,即 0011 0001
~ 按位取反运算符翻转操作数的每一位,即0变成1,1变成0。 ~A得到-61,即1100 0011
<< 按位左移运算符。左操作数按位左移右操作数指定的位数。
(低位补零)
A << 2得到240,即 1111 0000
>> “有符号”按位右移运算符。左操作数按位右移右操作数指定的位数。
该操作符使用 “符号扩展”:若符号为正,则高位插入 0;若符号为负,则高位插入 1。
A >> 2得到15即 1111
>>> “无符号”按位右移补零操作符。左操作数的值按右操作数指定的位数右移,移动得到的空位以零填充。
该操作符使用 “零扩展”,无论正负,都在高位插入 0。
A>>>2得到15即0000 1111

按位操作符

按位操作符用来操作整数的二进制位,会对两个参数中对应的位执行布尔代数运算,并最终生成一个结果。

与操作符 “&”,如果两个输入位都是 1,那么输出位是 1,否则输入位是 0;

或操作符 “|” ,如果两个输入位有一个是 1,那么输出位是 1,只有两个输入位都是 0,输出位才是 0;

异或运算符 “^”,如果两个输入位都为 1 或者都为 0,那么输出位是 0,否则输出位是 1。

非运算符 “~”,这个一元操作符,只能对一个数操作,规则是输出位与输入位相反。

//转化为二进制:0101
int num1 = 5;
//转化为二进制:1001
int num2 = 9;
//与运算,二进制结果为 0001,打印结果为 1
System.out.println(num1 & num2);
//或运算,二进制结果为 1101,打印结果为 13
System.out.println(num1 | num2);
//异或运算,二进制结果为 1100,打印结果为 12
System.out.println(num1 ^ num2);
//非运算,二进制结果为 11111111111111111111111111111010,打印结果 -6
System.out.println(Integer.toBinaryString(~num1));

好吧,进哥承认,我看到那个 -6 也蒙了那么一下,所以整理了以下内容。

补充

数字的二进制表现形式为 “有符号的二进制补码”。

原码:数字的二进制表示法,最高位为符号位, “ 0 ” 为正,“ 1 ” 为负。

反码:正数的反码与原码相同,负数的反码对原码逐位取反,符号位除外。

补码:正数的补码与原码相同,负数的补码在其反码末位加 1。

负数的二进制算法(以 -6 为例):

1)将 -6 的绝对值转化为二进制,即:00000000 00000000 00000000 00000110

2)求该二进制数的反码,即:11111111 11111111 11111111 11111001

3)对以上求得的二进制数加 1,即:11111111 11111111 11111111 11111010

移位操作符

移位操作符的运算对象也是二进制的 “位”,但是只能用来处理整数类型。

  • 左移位操作符 “<<” 按照操作符右侧指定的位数将操作符左边的操作数向左移动(低位补零);

  • “有符号”右移位操作符 “>>” 按照操作符右侧指定的位数将操作符左边的操作数向右移动。该操作符使用 “符号扩展”:若符号为正,则高位插入 0;若符号为负,则高位插入 1。

  • “无符号”右移位操作符 “>>>”,该操作符使用 “零扩展”,无论正负,都在高位插入 0。

//二进制 1111;
int i = 15;
//向右边移动两位,二进制结果为 0011,打印结果为 3
System.out.println(i >> 2);
//向左边移动两位,二进制结果为 111100,打印结果为 60
System.out.println(i << 2);

移位操作符可以与等号组合使用(<<= 或 >>= 或 >>>=),表示操作符左边的值会移动由右边数值指定的位数,再将得到的结果赋给左边的变量。


Java运算符

Java运算符按功能可分为:算数运算符、关系运算符、逻辑运算符、位运算符、赋值运算符和条件运算符。

算数运算符

算术运算符包括通常的加(+)、减(-)、乘(*)、除(/)、取模(%),完成整数型和浮点型数据的算术运算。

许多语言中的取模运算只能用于整数型,Java对此做了扩展,它允许对浮点数进行取模操作。例如,3%2 的结果是 1, 15.2%5 的结果是 0.2。取模操作还可以用于负数,结果的符号与第一个操作数的符号相同,例如,5%-3 的结果是 2,-5%3 的结果是-2。

此外,算术运算符还有“++”和“--”两种,分别称为加1和减1运算符。这两种运算符有前缀形式和后缀形式,含有有所不同。例如,i++ 和 ++i 的执行顺序是不一样的,i++ 在 i 使用之后再 +1,++i 在 i 使用之前先 +1。i-- 和 --i 的情况于此类似。

例子:

int i = 1;
System.out.println(i++); //i++,使用之后+1,此处输出1 int i = 1;
System.out.println(++i); //++i,先+1再使用,此处输出2 int i = 1;
System.out.println(i--); //i--,使用之后-1,此处输出1 int i = 1;
System.out.println(--i); //--i,先-1再使用,此处输出0

关系运算符

关系运算符用来比较两个值,包括大于(>)、小于(<)、大于等于(>=)、小于等于(<=)、等于(==)和不等于(!=)6种。关系运算符都是二元运算符,也就是每个运算符都带有两个操作数,运算的结果是一个逻辑值。Java允许“==”和“!=”两种运算符用于任何数据类型。例如,既可以判断两个数的值是否相等,也可以判断对象或数组的实例是否相等。判断实例时比较的是两个对象在内存中的引用地址是否相等。

逻辑运算符

逻辑运算符包括逻辑与(&&)、逻辑或(||)和逻辑非(!)。前两个是二元运算符,后一个是一元运算符。Java对逻辑与和逻辑或提供“短路”功能,也就是在进行运算时,先计算运算符左侧的表达式的值,如果使用该值能得到整个表达式的值,则跳过运算符右侧表达式的计算,否则计算运算符右侧表达式,并得到整个表达式的值。

//逻辑与&&,有一个表达式的结果是false,整体就返回false
String str = null;
if(str != null && str.length0 > 2) {
// str是null, &&左侧的表达式的结果是false,不会计算&&右侧的表达式,直接整体返回false
} str= "abc";
if(str != null && str.length0> 5) {
// &&左侧的表达式的结果是true,会接着计算&&右侧的表达式,右侧表达式的值是false,整个if中的表达式的结果就返回false
} //逻辑或||,有一个表达式的结果是true,整体就返回true
str= "qq";
if(str == null II str.length0== 2) {
// ||左侧的表达式的结果是false,会接着计算||右侧的表达式,右侧结果是true, 则整体返回true
}
if(str != null II str.ength0 == 2) {
// ||左侧的表达式的结果是true, 不会计算||右侧的表达式, 直接整体返回true
} //逻辑非!,表达式结果是true,就返回false; 表达式结果是false,就返回true
boolean flag = true;
System.out.printIn(!flag); //输出false
flag = false;
System.out.printn(!flag); //输出true

位运算符

位运算符用来对二进制位进行操作,包括按位取反(~)、按位与(&)、按位或(|)、异或(^)、右移(>>)、左移(<<)和无符号右移(>>>)。位运算符只能对整数型和字符型数据进行操作。

1. 取反(~)

参加运算的一个数据,按二进制位进行“取反”运算。

运算规则:~1=0; ~0=1;

即:对一个二进制数按位取反,即将0变1,1变0。

2. 按位与(&)

参加运算的两个数据,按二进制位进行“与”运算。

运算规则:0&0=0; 0&1=0; 1&0=0; 1&1=1;即:两位同时为“1,结果才为“1,否则为0。

例如:3&5 即 0000 0011 & 0000 0101 = 0000 0001 因此,3 & 5的值得1。

3. 按位或(|)

参加运算的两个对象,按二进制位进行“或”运算。

运算规则:0 | 0=0; 0 | 1=1; 1 | 0=1; 1 | 1=1;

即 :参加运算的两个对象只要有一个为1,其值为1。

例如:3 | 5,即 0000 0011 | 0000 0101 = 0000 0111 因此,3 | 5的值得7。

4. 异或(^)

参加运算的两个数据,按二进制位进行“异或”运算。

运算规则:0^0=0; 0^1=1; 1^0=1; 1^1=0;

即:参加运算的两个对象,如果两个相应位为“异”(值不同),则该位结果为1,否则为0。

5. 左移(<<)

运算规则:按二进制形式把所有的数字向左移动对应的位数,高位移出(舍弃),低位的空位补零。例如: 12345 << 1,则是将数字12345左移1位:

位移后十进制数值变成:24690,刚好是12345的二倍,所以有些人会用左位移运算符代替乘2的操作,但是这并不代表是真的就是乘以2,很多时候,我们可以这样使用,但是一定要知道,位移运算符很多时候可以代替乘2操作,但是这个并不代表两者是一样的。

思考一下:如果任意一个十进制的数左位移32位,右边补位32个0,十进制岂不是都是0了?当然不是!!! 当int 类型的数据进行左移的时候,当左移的位数大于等于32位的时候,位数会先求余数,然后再进行左移,也就是说,如果真的左移32位 12345 << 32 的时候,会先进行位数求余数,即为 12345<<(32%32) 相当于 12345<< 0 ,所以12345<< 33 的值和12345<<1 是一样的,都是 24690。

6. 右移(>>)

同样,还是以12345这个数值为例,12345右移1位: 12345>>1。

右移后得到的值为 6172 和int 类型的数据12345除以2取整所得的值一样,所以有些时候也会被用来替代除2操作。另外,对于超过32位的位移,和左移运算符一样,,会先进行位数求余数。

7. 无符号右移(>>>)

无符号右移运算符和右移运算符是一样的,不过无符号右移运算符在右移的时候是补0的,而右移运算符是补符号位的。以下是-12345二进制表示:

对于源码、反码、补码不熟悉的同学,请自行学习,这里就不再进行补充了讲解了,这里提醒一下,在右移运算符中,右移后补0,是由于正数 12345 符号位为0 ,如果为1,则应补1。

1、原码、反码和补码说明:一个数可以分成符号位(0正1负)+ 真值,原码是我们正常想法写出来的二进制。由于计算机只能做加法,负数用单纯的二进制原码书写会出错,于是大家发明了反码(正数不变,负数符号位不变,真值部分取反);再后来由于+0, -0的争端,于是改进反码,变成补码(正数不变,负数符号位不变,真值部分取反,然后+1)。二进制前面的0都可以省略,所以总结来说:计算机里的负数都是用补码(符号位1,真值部分取反+1)表示的。2、位运算符和2的关系位运算符和乘2、除2在大多数时候是很相似的,可以进行替代,同时效率也会高的多,但是两者切记不能混淆 ;很多时候有人会把两者的概念混淆,尤其是数据刚好是 2、4、6、8、100等偶数的时候,看起来就更相似了,但是对于奇数,如本文使用的12345 ,右移之后结果为6172 ,这个结果就和数学意义上的除以2不同了,不过对于int 类型的数据,除2 会对结果进行取整,所以结果也是6172 ,这就更有迷惑性了。

赋值运算符

赋值运算符的作用就是将常量、变量或表达式的值赋给某一个变量。

运算符 运算 范例 结果
= 赋值 a=3;b=2; a=3;b=2;
+= 加等于 a=3;b=2;a+=b; a=5;b=2;
-= 减等于 a=3;b=2;a-=b; a=1;b=2;
*= 乘等于 a=3;b=2;a*=b; a=6;b=2;
/= 除等于 a=3;b=2;a/=b; a=1;b=2;
%= 模等于 a=3;b=2;a%=b; a=3;b=2;

除了“=”,其它的都是特殊的赋值运算符,以“+=”为例,x += 3就相当于x = x + 3,首先会进行加法运算x+3,再将运算结果赋值给变量x。-=、*=、/=、%=赋值运算符都可依此类推。

条件运算符

条件运算符( ? : )也称为 “三元运算符”或“三目运算符”。

语法形式:布尔表达式 ? 表达式1 :表达式2。

运算过程:如果布尔表达式的值为 true ,则返回 表达式1的值,否则返回 表达式2 的值。

运算符的优先次序

在对一个表达式进行计算时,如果表达式中含有多种运算符,则要安运算符的优先次序一次从高向低进行。运算符的优先次序如下:

优先级 运算符 简介 结合性
1 []、.、() 方法调用,属性获取 从左向右
2 !、~、++、-- 一元运算符 从右向左
3 *、/、% 乘、除、取模(余数) 从左向右
4 +、- 加、减 从左向右
5 <<、>>、>>> 左位移、右位移、无符号右位移 从左向右
6 <、<=、>、>=、instanceof 小于、小于等于、大于、大于等于
对象类型判断是否属于同类型
从左向右
7 ==、!= 相等、不相等 从左向右
8 & 按位与 从左向右
9 ^ 按位异或 从左向右
10 | 按位或 从左向右
11 && 逻辑与 从左向右
12 || 逻辑或 从左向右
13 ? 条件运算符 从右向左
14 =、+=、-=、*=、/=、%=、&=、|=、^=、>>= 混合赋值运算符 从右向左

【Java】位操作符的更多相关文章

  1. Java的按位操作符

    本文参考:Java的位操作符 Java的位操作符用来操作整数基本数据类型中的单个"比特"(bit),即代进制位.而我们知道比特就是0和1,那么,位操作就是对这些数据进行基本的操作. ...

  2. 【关于Java移位操作符&按位操作符】

    一.java按位运算符(操作符) 这段时间偶尔看一下源码,会发现有很多很基础的java知识在脑海中已经慢慢的淡成不常用记忆,于是打算捡起来一些. 按位运算符是来操作整数基本数据类型中的单个“比特”(b ...

  3. Java自学-操作符 位操作符

    Java的位操作符 位操作符 在实际工作中使用并不常见. 示例 1 : 一个整数的二进制表达 位操作都是对二进制而言的,但是我们平常使用的都是十进制比如5. 而5的二进制是101. 所以在开始学习之前 ...

  4. Java知识系统回顾整理01基础04操作符04位操作符

    一.位操作符 位操作符在实际工作中用的并不常见,但是我比较纠结这些位操作.所以实际练习位操作符的每一个操作符的操作实例来理解其具体含义. 建议: 如果确实感兴趣,就看看,个人建议跳过这个章节. 真正工 ...

  5. Java 位运算2-LeetCode 201 Bitwise AND of Numbers Range

    在Java位运算总结-leetcode题目博文中总结了Java提供的按位运算操作符,今天又碰到LeetCode中一道按位操作的题目 Given a range [m, n] where 0 <= ...

  6. Java位运算总结-leetcode题目

    按位操作符只能用于整数基本数据类型中的单个bit中,操作符对应表格: Operator Description & 按位与(12345&1=1,可用于判断整数的奇偶性) | 按位或 ^ ...

  7. java基础-操作符

    浏览以下内容前,请点击并阅读 声明 定义:操作符是一种能够对一个,两个或三个操作对象执行特定的操作,并返回一个结果的特定符号. java中操作符的种类和优先级如下表所示,除了赋值运算,所有二元操作符运 ...

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

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

  9. 第三节:带你详解Java的操作符,控制流程以及数组

    前言 大家好,给大家带来带你详解Java的操作符,控制流程以及数组的概述,希望你们喜欢 操作符 算数操作符 一般的 +,-,*,/,还有两个自增 自减 ,以及一个取模 % 操作符. 这里的操作算法,一 ...

随机推荐

  1. java锁的对象引用

    当访问共享的可变数据时,通常需要同步.一种避免使用同步的方式就是不共享数据. 如果数据仅在单线程内访问,就不需要同步,这种技术称为"线程封闭",它是实现线程安全性最简单方式之一. ...

  2. allator 对springBoot进行加密

    1.对springboot项目添加jar包和xml文件 allatori.xml: <config> <input> <jar in="target/sprin ...

  3. RestTemplate post请求

    以前一开始用原生的http请求,那叫一个累,后来找到一个第三方的工具包,用起来是真的舒服,不过有一说一,第三方工具包依赖性真的强,除非和组长商量过,不然能少用,还是少用点.话说搞微服务的肯定少不了和H ...

  4. Hive语法小释

    阅读本文你可以获取: 1.数据库的查询 2.hive表的基本操作(建表三种常用方式.删除表.修改表.加载数据.内外表转换.添加分区.复制数据) 3.SQL到HiveQL的的一些不同点 1.   基本操 ...

  5. (Oracle)索引实战(转载)

    人们在使用SQL时往往会陷入一个误区,即太关注于所得的结果是否正确,而忽略了不同的实现方法之间可能存在的性能差异,这种性能差异在大型的或是复杂的数据库环境中(如联机事务处理OLTP或决策支持系统DSS ...

  6. redis 主从复制 和集群

    redis集群最少三个节点 之间相互通信ping-pong 投票选举机制 主从复制 的话 最少六个节点 ,主三从三

  7. Spark调优 | Spark Streaming 调优

    Spark调优 | Spark Streaming 调优 1.数据序列化 2.广播大变量 3.数据处理和接收时的并行度 4.设置合理的批处理间隔 5.内存优化 5.1 内存管理 5.2优化策略 5.3 ...

  8. Kubernetes之持久化存储

    转载自 https://blog.csdn.net/dkfajsldfsdfsd/article/details/81319735 ConfigMap.Secret.emptyDir.hostPath ...

  9. MySQL 数据库性能调优

    MySQL 数据库性能调优 MySQL性能 最大数据量 最大并发数 优化的范围有哪些 存储.主机和操作系统方面: 应用程序方面: 数据库优化方面: 优化维度 数据库优化维度有四个: 优化选择: 数据库 ...

  10. redis学习教程三《发送订阅、事务、连接》

    redis学习教程三<发送订阅.事务.连接>  一:发送订阅      Redis发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息.Redi ...