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)是可以这么使用的!!