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 ...
随机推荐
- MYSQL 之 JDBC(五): 增删改查(三)PreparedStatement
是Statement的子接口,可以传入带占位符的sql语句,并且提供了补充占位符变量的方法. 使用Statement需要进行拼写SQL语句,很辛苦,很容易出错. 引号的问题处理很复杂,不利于维护. 可 ...
- python 追踪函数调用
from flask import Flask import traceback app = Flask(__name__) @app.route('/') def hello_world(): tr ...
- 数据可视化之powerBI基础(八)PowerBI的表格,你真的会用吗
https://zhuanlan.zhihu.com/p/64413000 在PowerBI的可视化对象中,还有两个「表格」对象,表格的作用不仅可以在报表提供明细数据,还经常用来测试度量值的返回结果, ...
- Django框架05 /orm单表操作
Django框架05 /orm单表操作 目录 Django框架05 /orm单表操作 1. orm使用流程 2. orm字段 3. orm参数 4. orm单表简单增/删/改 5. orm单表查询 5 ...
- 使用Azure Application Insignhts监控ASP.NET Core应用程序
Application Insignhts是微软开发的一套监控程序.他可以对线上的应用程序进行全方位的监控,比如监控每秒的请求数,失败的请求,追踪异常,对每个请求进行监控,从http的耗时,到SQL查 ...
- Crawlab Lite 正式发布,更轻量的爬虫管理平台
Crawlab 是一款基于 Golang 的分布式爬虫管理平台,产品发布已经一年有余,经过开发团队的不断打磨,即将迭代到 v0.5 版本.在这期间我们为 Crawlab 加入了大量社区用户共同期望的功 ...
- 面试官:请你说下N95应该怎么测试?这样回答让他竖起大拇指!
随着”新冠疫情“慢慢地消散,各大企业都开始恢复正常的运行. 因为疫情造成很多工作人员的流失,企业也开始疯狂的招聘新鲜的人才,这对于莘莘求职者无疑是个机会. 但是因为求职者众多,很多面试官也开始想方设法 ...
- three.js 制作属于自己的动态二维码
今天郭先生说一下用canvas解析图片流,然后制作一个动态二维码的小案例,话不多说先上图,在线案例点击博客原文.这是郭先生的微信二维码哦! 1. 解析图片流 canvas = document.cre ...
- 因为喜欢所以升级,MyStaging-3.0 继续
我为什么维护MyStaging 目前该项目只有我一个人在维护,权当学习交流.为什么要继续维护呢,说一千道一万,还是因为喜欢,由于他的简单易用,从而促使我决定对 MyStaging 进行升级,目前 3. ...
- 详解Java的对象创建
1. 前言 在<还不清楚怎样面向对象?>和<面向对象再探究>两篇文章中,都介绍了关于面向对象程序设计的概念和特点.其中也涉及到了许多代码,比如: Dog dog = new D ...