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 ...
随机推荐
- JVM 专题十四:本地方法接口
1. 本地方法接口 2. 什么是本地方法? 简单来讲,一个Native Method就是一个Java调用非Java代码的接口.一个Native Method是这样一个java方法:该方法的实现由非Ja ...
- 数据可视化之powerBI技巧(二十一)简单三个步骤,轻松管理你的Power BI度量值
最近碰到几个星友的问题,都是问我之前分享的源文件是如何把度量值分门别类放到不同的文件夹中的,就像这样, 其实在之前的文章中也曾提及过做法,这里再详细说一下制作步骤: 01 | 新建一个空表 点击菜单栏 ...
- 3dTiles 数据规范详解[4.2] i3dm瓦片二进制数据文件结构
i3dm,即 Instanced 3D Model,实例三维模型的意思. 诸如树木.路灯.路边的垃圾桶.长椅等具有明显 重复 特征的数据.这类数据用得较少(笑,现在都喜欢搞BIM.倾斜摄影.精模.白模 ...
- python发送邮件插件
github链接:https://github.com/573734817pc/SendEmailPlug-in.git 说明: 1.该插件功能为发送邮件. 2.基于python编写. 3.使用的时候 ...
- Ethical Hacking - NETWORK PENETRATION TESTING(22)
MITM - Wireshark WIreshark is a network protocol analyser that is designed to help network administa ...
- CocosCreator之分层管理的ListView
前言 进入公众号回复listview即可获得demo的git地址. 之前写的一篇文章<Creator之ScrollView那些事>中提到了官方Demo中提供的ListViewCtl,只是实 ...
- Mysql报Too many connections,不要乱用ulimit了,看看如何正确修改进程的最大文件数
背景 今天在学习mysql时,看到一个案例,大体来说,就是客户端报Too many connections.但是,客户端的连接池,限制为了200,两个客户端java进程,那也才400,然后mysql配 ...
- echarts 踩坑 : 为什么效果出不来?看看有没有正确引入
今天我要给 echarts 组件加个 dataZoom 功能,结果发现没有效果. 后来发现是引入 echarts 模块的问题. 如果是按需引入的话,必须引入相应的功能模块才能使用相应的功能. 举例: ...
- spring读取jdbc(file方式)
使用PropertyPlaceholderConfigurer类载入外部配置 在Spring项目中,你可能需要从properties文件中读入配置注入到bean中,例如数据库连接信息,memcache ...
- vue学习(十九) 生命周期 了解
生命周期:从vue实例创建.运行.到销毁期间,总是伴随着各种各样的事件,这些事件统称为生命周期 生命周期钩子:就是生命周期事件的别名而已 生命周期钩子==生命周期函数==生命周期事件 生命周期函数分类 ...