java的运算符

1.前加既后加的问题!

int a=1;

int b=a++;

结果b=1;

运算顺序:b=a ;a=a+1;

 

int a=1;

int b=++a;

结果b=2;

运算顺序 ;a=a+1;b=a

以此类推,--也是一样的!

a+=b;

运算顺序是a=a+b;一次类推a-=b;a*=b;a/=b;a%=b;运算顺序都是一样的。

2.按位非(~)

计算机中都是以补码来计算的,所以要转换!

int a=8;

a=~a;

运算过程如下:

因为8为正,原码反码补码是一样的,所以

补码是:00000000 00000000 00000000 00001000

对补码取反,就是0就变1,1就变0!取反的时候,连符号位都要变

取反是:11111111 11111111 11111111 11110111

取反后的这个码被看做一个负数的补码。要求出这个补码的原码

补码-1(因为负数的反码求补码要+1,所以反过来就要-1)

反码:11111111 11111111 11111111 11110110

(注意,因为是负数,所以符号位不能变!)

原码:10000000 00000000 00000000 00001001

最后得出 a=~a   a=-9

 

int a=-8 

a=~a;

 

原码:10000000 00000000 00000000 00001000

(负数,符号位不能变)

反码:11111111 11111111 11111111 11110111

补码:11111111 11111111 11111111 11111000

(取反的时候,连符号位都要变)

对补码取反;00000000 0000000 0000000 000000111(是正数)

是正数,正数的原码反码补码一样,所以

原码也是:00000000 0000000 0000000 000000111,所以结果为

a=7

这么算很麻烦,但是有个规律,就是 a=~a;   a=-(a+1)

3. && ,&,||,|,!,^

&&.||.!这三个大家肯定很熟悉,就是与、或、非。

&  |   ^这三个符号比较陌生,其实是计算二进制的与或非

int a=4;

int b=5;

int c=a&b;

a=4:00000100

b=5:00000101

c=a&b:00000100:4

由上例可知,就是将数字转化成二进制码,每位进行与运算。

同理!   | 就是或运算,而^是异或运算!

异或的真值表是:相同为0;不同为1.也就是:1^1=0,0^0=0,其余都得1

 

4.短路现象

public boolean a(){

return true;

};

 

public boolean b(){

return false;

};

public boolean c(){

return true;

};

if(a() && b() && c()){}

我们都会习惯性的以为,java程序会分别进入a(),b(),c()

其实,这里会出现一种短路现象,因为与运算只要出现一个false,结果就肯定是false,所以当b()返回false的时候,java程序就已经知道结果为false,不能进入if,所以不会执行c(),,同理可证,||或运算也是一样的。

5.移位操作符

本次内引用了其他博客的内容:引用地址http://blog.csdn.net/sxhlovehmm/article/details/44244195

Java移位运算符不外乎就这三种:<<(左移)、>>(带符号右移)和>>>(无符号右移)。

<< :带符号左移  >>:带符号右移   

>>> :不带符号的右移  <<<:不带符号的左移

无符号右移后前面补0,而带符号右移是补符号位,也就 是第一位,负数补1,正数补0

 

左移运算规则:

按二进制形式把所有的数字向左移动对应的位数,高位移出(舍弃),低位的空位补零。
当左移的运算数是int 类型时,每移动1位它的第31位就要被移出并且丢弃;
当左移的运算数是long 类型时,每移动1位它的第63位就要被移出并且丢弃。
当左移的运算数是byte 和short类型时,将自动把这些类型扩大为 int 型。

a=10:  00000000 00000000 00000000 00001010

2<<a;  00000000 00000000 00000000 00101000

右移运算规则:

按二进制形式把所有的数字向右移动对应的位数,低位移出(舍弃),高位的空位补符号位,即正数补零,负数补1
当右移的运算数是byte 和short类型时,将自动把这些类型扩大为 int 型。
例如,如果要移走的值为负数,每一次右移都在左边补1,如果要移走的值为正数,每一次右移都在左边补0,这叫做符号位扩展(保留符号位)(sign extension ),在进行右移

a=10:  00000000 00000000 00000000 00001010

a>>2;  00000000 00000000 00000000 00000010

a=-10:10000000 00000000 00000000 00001010

a>>2:11100000 00000000 00000000 00000010

不带符号的左移右移就一个特点,全部用0补,不需要分正负

6.三元操作符

return i<10?12:20;

等同于

if(i<10){

return 12;

}else{

return 20;

}

7.while(x=y)也可以编译的

当x和y是boolean的时候  while(x=y)是可以这么使用的!!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值