首页 > 编程语言 >Java-Java中的运算符

Java-Java中的运算符

时间:2022-08-25 09:35:02浏览次数:64  
标签:右移 1111 0000 image 运算符 按位 Java

修订记录 版本 是否发布
2020-09-23 v1.0

一、Java &、&&、|、||、^、<<、>>、~、>>>等运算符

*Java运算符大致分为逻辑运算符(&&,||,!)、算数运算符(+, -, , / ,+=)、位运算符(^,|,&)、其他运算符(三元运算符)

&(按位与)

image-20200923160517009
image-20200923160517009

位运算符

&按位与的运算规则是将两边的数转换为二进制位,然后运算最终值,运算规则即(两个为真才为真)1&1=1 , 1&0=0 , 0&1=0 , 0&0=0

3的二进制位是0000 0011 , 5的二进制位是0000 0101 , 那么就是011 & 101,由按位与运算规则得知,001 & 101等于0000 0001,最终值为1

7的二进制位是0000 0111,那就是111 & 101等于101,也就是0000 0101,故值为5

&&(逻辑与)

image-20200923160619722
image-20200923160619722

逻辑运算符

&&逻辑与也称为短路逻辑与,先运算&&左边的表达式,一旦为假,后续不管多少表达式,均不再计算,一个为真,再计算右边的表达式,两个为真才为真。

|(按位或)

image-20200923160700528
image-20200923160700528

位运算符

|按位或和&按位与计算方式都是转换二进制再计算,不同的是运算规则(一个为真即为真)1|0 = 1 , 1|1 = 1 , 0|0 = 0 , 0|1 = 1

6的二进制位0000 0110 , 2的二进制位0000 0010 , 110|010为110,最终值0000 0110,故6|2等于6

||(逻辑或)

image-20200923160740523
image-20200923160740523

逻辑运算符

逻辑或||的运算规则是一个为真即为真,后续不再计算,一个为假再计算右边的表达式。

^(异或运算符)

image-20200923160818245
image-20200923160818245

位运算符

^异或运算符顾名思义,异就是不同,其运算规则为1^0 = 1 , 1^1 = 0 , 0^1 = 1 , 0^0 = 0

5的二进制位是0000 0101 , 9的二进制位是0000 1001,也就是0101 ^ 1001,结果为1100 , 00001100的十进制位是12

<<(左移运算符)

image-20200923160859822
image-20200923160859822

位运算符

5<<2的意思为5的二进制位往左挪两位,右边补0,5的二进制位是0000 0101 , 就是把有效值101往左挪两位就是0001 0100 ,正数左边第一位补0,负数补1,等于乘于2的n次方,十进制位是20

>>(右移运算符)

image-20200923160932344
image-20200923160932344

位运算符

凡位运算符都是把值先转换成二进制再进行后续的处理,5的二进制位是0000 0101,右移两位就是把101左移后为0000 0001,正数左边第一位补0,负数补1,等于除于2的n次方,结果为1

~(取反运算符)

image-20200923161018178
image-20200923161018178

位运算符

取反就是1为0,0为1,5的二进制位是0000 0101,取反后为1111 1010,值为-6

>>>(无符号右移运算符)

image-20200923161229280
image-20200923161229280

正数无符号右移

无符号右移运算符和右移运算符的主要区别在于负数的计算,因为无符号右移是高位补0,移多少位补多少个0。
15的二进制位是0000 1111 , 右移2位0000 0011,结果为3

image-20200923161303434
image-20200923161303434

负数无符号右移

-6的二进制是6的二进制取反再加1,6的二进制也就是0000 0000 0000 0000 0000 0000 0000 0110,取反后加1为1111 1111 1111 1111 1111 1111 1111 1010,右移三位0001 1111 1111 1111 1111 1111 1111 1111

二、图解 Java 位运算

1. 原码、反码、补码的转换

(1) 正数的原码、反码、补码相同

image-20200923162020156
image-20200923162020156

(2) 负数的原码、反码、补码转换如下图所示

image-20200923162036559
image-20200923162036559

需要说明的是,在计算机中,数字是以补码的形式存在的,计算也是用补码来进行计算,计算后的结果也是补码

2. 位运算

(1) & : 按位与

5 & 9 = 1

image-20200923162100064
image-20200923162100064

(2) | : 按位或

image-20200923162117111
image-20200923162117111

(3) ^ : 按位异或

5 ^ 9 = 12

image-20200923162134629
image-20200923162134629

(4) ~ : 按位非

~5 = -6

image-20200923162155091
image-20200923162155091

(5) << : 左移

5 << 2 = 20

image-20200923162210304
image-20200923162210304

-5 << 2 = -20

image-20200923162224505
image-20200923162224505

(6) >> : 右移

-5 >> 2 = -2

image-20200923162240874
image-20200923162240874

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

-5 >>> 2 = 1073741822

image-20200923162258861
image-20200923162258861

3. 注意

  • 对于低于 int 类型(如byte、short和char)的操作数总是先自动转换为int类型后再移位
  • 对于 int 类型的整数移位 a >> b, 当 b>32 时,系统先用 b 对 32 求余(因为 int 是 32 位),得到的结果才是真正移位的位数,例如,a >> 33 和 a >> 1 的结果相同,而 a >> 32 = a
  • 对于 long 类型的整数移位 a >> b, 当 b>64 时,系统先用 b 对 64 求余(因为 long 是 64 位),得到的结果才是真正移位的位数
  • 当进行移位运算时,只要被移位的二进制码没有发生有效位的数字丢失(对于正数而言,通常指被移出去的位全部是 0),不难发现左移 n 位就相当于乘以 2 的 n 次方,右移 n 位则是除以 2 的 n 次方
  • 进行移位运算不会改变操作数本身,只是得到了一个新的运算结果

标签:右移,1111,0000,image,运算符,按位,Java
From: https://www.cnblogs.com/BCX-1024/p/javajava-zhong-de-yun-suan-fu.html

相关文章

  • Java-Java操作SFTP工具类
    一、SFTP工具类二、配置文件Bean修订记录版本是否发布2020-08-03v1.0是一、SFTP工具类importcom.*.*.common.util.FileUtil;importcom.*.*.comm......
  • Java8 对list集合中的bigdecimal进行分组求和,均值,最大值,最小值
     文章目录需求中对数值进行求和的非常多,但java8对bigdecimal求和没有封装新建接口ToBigDecimalFunction新建工具类CollectorsUtil实体类Person 需求中对......
  • Java 获取三天前时间
    (1)根据newDate().getTime()获取从1970年1月1日0点0分到目前的毫秒数计算三天前的时间:DatedateBy3Days=newDate(newDate().getTime()-3*24*60*60*1000);  Sim......
  • 不使用骨架创建maven的java工程、使用骨架创建maven的web工程
    不使用骨架创建maven的java工程    使用骨架创建maven的web工程  选入web框架 ......
  • Java函数式编程
    函数式编程-Stream流1.概述1.1为什么学?能够看懂公司里的代码大数量下处理集合效率高代码可读性高消灭嵌套地狱//查询未成年作家的评分在70以上的书籍由于洋流......
  • Java学习笔记5
    抽象类抽象类和其中抽象方法由abstract修饰,继承抽象类的所有方法必须由子类实现。Java的类是单继承,但是可以继承多个接口抽象类不能new实例化接口普通类:只有具体实......
  • Java继承
    继承概述由来:多个类中存在相同属性和行为时,将这些内容抽取到单独一个类中,那么多个类无需再定义这些属性和行为,只要继承那一个类即可。如图所示:其中,多个类可以......
  • Java中字节流的总结及代码练习
    Java中的字节流在描述字节流时,先知道什么是流流可以分为:输入流和输出流输入流和输出流示意图:字节流读取内容:二进制,音频,视频优缺点:可以保证视频音频无损,效率低,没有缓......
  • 解构和扩展运算符
    解构解构赋值是对赋值运算符的扩展。是一种针对数组或者对象进行模式匹配,然后对其中的变量进行赋值。在代码书写上简洁且易读,语义更加清晰明了;也方便了复杂对象中数据......
  • 运算符
    运算符Java语言支持如下运算符:优先级()算术运算符:+、-、*、/、%、++(自增)、--(自减)赋值运算符=关系运算符:>、<、>=、<=、==(Java里的等于用两个等号)、!=instanceof(不等......