Java 的几种运算符
一、原码、反码、补码
1 用二进制表示 00000001
-1 如果只变符号位(原码) 10000001
那么 1 + -1 = 10000010 = -2
-1 的反码 11111110 除去符号位,整体翻转
-1 的补码(反码加 1) 11111111 补码 也等于 0 - 1 的原(补)码
1 的补码 + -1 的补码 10000000 = 0, 溢出 1 位
int 为 4 个字节,32 位,1 位作为符号位,表示大小的有 31 位
为了方便运算,Java 整数二进制默认使用补码表示,正数和 0 的补码不变,负数的补码为反码加 1
0: 00000000000000000000000000000000 32个0
2^32-1: 01111111111111111111111111111111 0 + 31个1
-2^31: 10000000000000000000000000000000 1 + 31个0
-2^31+1: 10000000000000000000000000000001 1 + 30个0 + 1
-1: 11111111111111111111111111111111 32个1
String s = Integer.toBinaryString(0x80000000); // 0x80000000: -2^31
- 1111 = 15 =
1*2^3 + 1*2^2 + 1*2^1 + 1*2^0,0001 为 1,等于 2^0
二、移位运算符
<< : 左移运算符
num << 1,num 转换为二进制,长度固定,丢弃最左边指定位数,1 位,整体向左移动 1 位,后面补 0。
以 int 类型为例,4 个字节,32 位,表示 -2^31 ~ 2^31 - 1,10000000000000000000000000000000 ~ 01111111111111111111111111111111,最左位是符号位,当小于 2^31 - 1 时,最左边都是 0,所以 0 代表为正数,1 代表为负数。
当 num 为正数,且没有达到最大值时,即左边的 0 够多时,num << 1 相当于二进制每一位转十进制时在原来基础上再乘以 2,相当于 num 乘以 2。达到最大值后,正数可能变负数。
>> : 右移运算符
num >> 1,num 转换为二进制,丢弃最右边指定位数,1 位,整体向右移动 1 位,后面补符号位,如果 num 为正数,补 0,如果为负数,补 1。
当 num 为正数时,num >> 1 相当于 num 除以 2 取整(/)。
int 类型 4 字节,正数右移 31 位变为 0,右移 32 位相当于不移位,当大于 32 位时,先求余,再移位。long 类型 64 位取余。
>>> : 无符号右移运算符
丢弃最右边指定位数,整体右移指定位,忽略符号位,后面空位都以 0 补齐。
因为左边没有符号,所以没有无符号左移。或者说,左移运算符就是无符号左移。
public static void main(String[] args) {
int intValue = 733183670;
int intValue2 = -733183670;
System.out.println(intValue + " 左移 1 位:" + (intValue << 1)); // 1466367340
System.out.println(intValue2 + " 左移 1 位:" + (intValue2 << 1)); // -1466367340
System.out.println(intValue + " 右移 8 位:" + (intValue >> 8)); // 2863998 (733183670/256)
System.out.println(intValue2 + " 右移 8 位:" + (intValue2 >> 8)); // -2863999
// 无符号右移,将数据变小,且最终为正数
System.out.println(intValue + " 无符号右移 8 位:" + (intValue >>> 8)); // 2863998
System.out.println(intValue2 + " 无符号右移 8 位:" + (intValue2 >>> 8)); // 13913217
}
733183670 << 1,左移 1 位:

-733183670 >> 8,右移 8 位:

-733183670 >>> 8,无符号右移 8 位:

三、位运算符
- 先转换为二进制后再运算
&按位与:1&1==1/1&0==0/0&0==0,都为 1,则为 1,否则为 0|按位或:1|1==1/1|0==1/0|0==0,有一个为 1,则为 1,否则 为 0~按位非:~1==0/~0==1, 单位为 bit,整数类型的话:~1==-2-->~0b00000000000000000000000000000001==0b11111111111111111111111111111110^: 异或运算符1^1==0/1^0==1/0^0==0,相同为 0,不同为 、1
四、逻辑运算符
&&逻辑与:当左边表达式为 false 时,不再计算,直接为 false。规则跟&一致||逻辑或:当左边表达式为 true 时,不再计算,直接为 true。规则跟|一致
五、延伸阅读
Java 的几种运算符的更多相关文章
- Java开发笔记(十四)几种运算符的优先级顺序
到目前为止,我们已经学习了Java语言的好几种运算符,包括算术运算符.赋值运算符.逻辑运算符.关系运算符等基础运算符,并且在书写赋值语句时都没添加圆括号,显然是默认了先完成算术.逻辑.关系等运算,最后 ...
- Java学习笔记四——运算符
算术运算符 加减乘除(+.-.*./)就不说了. 求余运算符% 描述:第一个操作数除以第二个操作数,得到一个整除的结果后剩下的值就是余数 注意:求余预算的结果不一定总是整数,当操作数是浮点数时,结果可 ...
- java的五种数据类型解析
不知道大家对java的简单数据类型是否了解,下面针对Java的五种类型简单数据类型表示数字和字符,进行详细的讲解和分析. 一.简单数据类型初始化 在Java语言中,简单数据类型作为类的成员变量声明时自 ...
- Java中常用的运算符
运算符是一种“功能”符号,用以通知 Java 进行相关的运算,Java 语言中常用的运算符可分为如下几种: 算数运算符.赋值运算符.比较运算符.逻辑运算符.条件运算符. 一.算数运算符 Java 中常 ...
- Java学习路线:Java中的位移运算符介绍
学习java本来就是一件日积月累的事情,或许你通过自学能掌握一些皮毛技术,学到java的一些基本大面,但想要做到精通,还是需要自己技术的日积月累和工作经验的不断积累. 今天给大家分享的技术知识是:ja ...
- Java的8种基本数据类型
待整理主题:Java的8种基本数据类型与对应封装类型.拆箱.装箱 =================================================================== ...
- java SE 入门之运算符(第三篇)
在 java 中主要有以上运算符,分为 赋值运算符 ,算术运算符.关系运算符(比较运算符),逻辑运算符和三目运算符(三元运算符). 我们一起来学习下吧! 一.赋值运算符 赋值运算符主要有五个.分别是 ...
- Java菜鸟之java基础语法,运算符(三)
赋值运算符 (一)JAVA种的赋值运算符 = ,代表代表的等于,一般的形式是 左边变量名称 = 右边的需要赋的指或者表达式,如果左侧的变量类型级别比较高,就把右侧的数据转换成左侧相同的高 ...
- Java学习笔记五:Java中常用的运算符
Java中常用的运算符 运算符是一种“功能”符号,用以通知 Java 进行相关的运算.譬如,我们需要将变量 score 的值设置为 20 ,这时候就需要一个“=”,告诉程序需要进行赋值操作. Java ...
随机推荐
- 李航统计学习方法(第二版)(六):k 近邻算法实现(kd树(kd tree)方法)
1. kd树简介 构造kd树的方法如下:构造根结点,使根结点对应于k维空间中包含所有实例点的超矩形区域;通过下面的递归方法,不断地对k维空间进行切分,生成子结点.在超矩形区域(结点)上选择一个坐标轴和 ...
- Linux如何用脚本监控Oracle发送警告日志ORA-报错发送邮件
Linux如何用脚本监控Oracle发送警告日志ORA-报错发送邮件 前言 公司有购买的监控软件北塔系统监控,由于购买的版权中只包含了有限台数据库服务器的监控,所以只监控了比较重要的几台服务器. 后边 ...
- bzoj1339[Baltic2008]Mafia*
bzoj1339[Baltic2008]Mafia 题意: 匪徒准备从一个车站转移毒品到另一个车站,警方准备进行布控.对于每个车站进行布控都需要一定的代价,现在警方希望使用最小的代价控制一些车站,使得 ...
- linux目录结构 主流Linux发行版的目录结构
目录 目录结构 一般教学的目录 CentOS7 openSUSE15.1 Ubuntu18.04 详细说明: /dev目录 /etc目录 /proc目录 /usr目录 /var目录 比较重要的目录 文 ...
- Docker部署LNMP完整教程
在Docker中部署LNMP环境可以分为以下几个步骤: 安装Docker 创建镜像 创建Dockerfile build Docerfile 复制/修改配置文件 运行镜像,并映射端口 为了方便分布式部 ...
- 深度学习趣谈:什么是迁移学习?(附带Tensorflow代码实现)
一.迁移学习的概念 什么是迁移学习呢?迁移学习可以由下面的这张图来表示: 这张图最左边表示了迁移学习也就是把已经训练好的模型和权重直接纳入到新的数据集当中进行训练,但是我们只改变之前模型的分类器(全连 ...
- Vue开发者必会的基础知识盘点
你会Vue吗,你看以下知识点你掌握了多少?实际工作中是否运用的得心应手?如果是,那么恭喜你! Vue中的数据和DOM已经被关联起来,所有的东西都是响应式的.注意我们不再和HTML直接交互.一个Vue应 ...
- APP自动化 -- contexts(上下文切换)
一.上下文是什么? 1.解释 1)在混合型APP中包含了 原生页面 和 H5页面,如果需要进入APP内嵌的H5页面里面去操作就需要先切换进去,如果要继续回到原生页面操作就需要切回来. 2)这个就像是 ...
- web自动化 -- 切换 iframe
先看源码 switch_to_frame() frame() 具体用法
- Elasticsearch必知必会的干货知识二:ES索引操作技巧
该系列上一篇文章<Elasticsearch必知必会的干货知识一:ES索引文档的CRUD> 讲了如何进行index的增删改查,本篇则侧重讲解说明如何对index进行创建.更改.迁移.查询配 ...