您的位置:首页 > 编程语言 > Java开发

开始看"java编程思想",写博客只是为了总结我的收获,免得忘记。很多内容都是

2017-08-16 14:22 302 查看

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)是可以这么使用的!!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐