java逻辑运算符和原码、反码、补码的理解

java逻辑运算符

java的逻辑运算符分为四种: 

1.逻辑且&

2.逻辑或|

3.逻辑异或^

4.逻辑非!

int x = 10;
int y = 10;
boolean result1 = ++x < 5 & ++y < 5;
System.out.println(x);//11
System.out.println(y);//11

 但是这种逻辑运算符效率非常低,他会同时执行两边,所以x和y都会++变成11

java短路运算符

 使用java短路运算符,具有短路效果(当左边的表达式能够确定最终结果,那右边的表达式就不会参与运行)

java短路运算符分为两种:

1.短路且&&

2.短路或||

int a = 10;
int b = 10;
boolean result2 = ++a < 5 && ++b < 5;
System.out.println(a);//11
System.out.println(b);//10

 左边的a先++后是11,由于11<5已经为false,所以右边不会在执行,b也就不会++了

原码、反码、补码

1.原码:十进制数据的二进制表现形式,最左边是符号位,0为正,1为负

缺点:使用原码进行计算的时候,正数不会出错;但负数会出错,因为符号位的缘故,实际运算的方向,跟正确的运算方向相反

例:

-0:    1000 0000

-0+1:1000 0001-->-1(与正确答案+1运算方向相反)

2.反码:为了解决原码不能计算负数而出现

计算规则:正数的反码不变;负数的反码在原码的基础之上,符号位不变,数值取反,0变1,1变0。

缺点:负数计算时,如果不跨0是正确;但如果结果跨0,由于0的反码有两个(+0和-0),所以计算结果会跟实际结果相差1(-1 + 1 = -0,-1 + 2 = +0)

例:

-1:1111 1110

-1+2:1111 1110 + 0000 0010 = 0000 0000 --> 0(与正确答案1相差1)

3.补码:为了解决负数计算时跨0的问题而出现的

计算规则:正数补码不变;负数在反码的基础上+1

注意点:

①计算机中的存储和计算都是以补码的形式存在的

②byte类型(8位/1个字节)的所能存储的最大值是127(补码:0111 1111),但最小值是-128(补码:1000 0000)。因为补码的缘故,使得原本-0的位置被-1所利用,所以原本最小值1111 1111(-127)的位置,被-128所利用,使得最小值变为-128。

③虽然-128没有原码和反码,但是没有影响,因为计算机都是以补码的形式进行存储和计算的

接下来,再回到逻辑运算符(0为false,1为true)

1.逻辑与& --> 两个数补码的对应位置都为1才是1,否则为0

int n1=200;                 //0000 0000 0000 0000 0000 0000 1100 1000
int n2=10;                  //0000 0000 0000 0000 0000 0000 0000 1010
System.out.println(n1 & n2);//0000 0000 0000 0000 0000 0000 0000 1000 --> 8

2.逻辑或| --> 两个数补码的对应位置都为0,才是0,否则为1

int n1=200;                 //0000 0000 0000 0000 0000 0000 1100 1000
int n2=10;                  //0000 0000 0000 0000 0000 0000 0000 1010
System.out.println(n1 | n2);//0000 0000 0000 0000 0000 0000 1100 1010 --> 202

左移、右移、无符号右移

1.左移<<

补码向左移动,低位补0(简便算法:左移一次就*2)

int n=200;                 //   0000 0000 0000 0000 0000 0000 1100 1000
System.out.println(n << 2);//   00 0000 0000 0000 0000 0000 1100 100000
                           //-->0000 0000 0000 0000 0000 0011 0010 0000 --> 800

2.右移>>

补码向右移动,高位补0或1(原来是正数,就补0;是负数,就补1-->简便算法:右移一次就/2)

int n=200;                //   0000 0000 0000 0000 0000 0000 1100 1000
System.out.println(n >>2);// 000000 0000 0000 0000 0000 0000 1100 10
                          //-->0000 0000 0000 0000 0000 0000 0011 0010 --> 50

3.无符号右移>>>

 补码向右移动,高位补0(不论正负)

 

  • 17
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值