java细节知识和位移运算符

假期没事,重温java,主要注重细节知识,下面是我个人做的笔记:

除法/的运算结果和运算对象的数据类型有关,两个数都是int,则商就是int,若商有小数,则截取小数部分;被除数和除数中只要有一个或两个都是浮点型数据,则商也是浮点型,不截取小数部分。

16/5 = =3   16/5.0 = =3.20000    -13/4 = =-4    -13/-3 = =4   3/5 = =0

取余%的运算符对象必须是整数,结果是整除后的余数,其余数的符号与被除数(%左边的数)相同。

13%3 = =1            13%-3 = =1           -13%3 = =-1  
-13%23 = =-13         -13%-23 = =-13        3%5 = =3

规律:%中,若左边的数小于右边的数,则结果就为左边的数;若左边的数等于右边的数,则结果就为0;右边是1,结果为0


字符串数据和任何数据使用+都是相连接,最终都会变成字符串。

	System.out.println("ab"+5+5);  //ab55
	System.out.println("ab"+(5+5));   //ab10
	int a=4, b=5;
	System.out.println(a+b);  //9
	System.out.println(a+","+b); // 4 , 5
	System.out.println("a="+a+", b="+b); // a=4, b=5

转义字符:通过\来转变后面字母或者符号的含义。转义字符写在被转义字符的前面。
\n:换行 linux系统中,回车符由\n表示
\b:退格 相当于backspace键。
\r:按下回车键。 window系统中,回车符是由两个字符表示\n\r
\t:制表符。相当于Tab键

System.out.println("\"hello\""); //"hello"
System.out.println("\\hello\\"); //\hello\
         
char ch='n';//对的
char ch='\n'; // 对的,转换成回车符,是可以的
char ch='\'; //错的
char ch='\"';  //对的
char ch='\'';//对的
char ch=''';  //错的
char ch='你'; //对 java中char是两个字节,一个汉字也是两个字节
	
int x=3; //右边的值赋值给左边
x+=4; //左右两边的和赋值给左边
short s=4;
s=s+5;  //错的,两次运算,先做加法再做赋值, 丢失精度报错 
s+=5; //对的,一次运算只做一次赋值运,它内部有一个自动转换动作
s = short(s+2); //错的

解析:
 s  =   s   +   5;
 short  short   double     
   2B      2B     4B

先相加变成double 类型数据,再将其存储到short类型空间中,导致数据丢失精度所以报错(大的数据类型不能向小的数据类型自动转换)


逻辑运算符
true & true = true;
true & false = false;
false & true = false;
false & false = false;

& : 只要两边的boolean表达式结果,有一个为false,那么结果就是false
只有两边都为true,结果才为true。

true | true = true
true | false = true
false | true = true
false | false = false

|:两边只要有一个true,结果为true.
只有两边都为false,结果才为false

^:异或:相同为假(false),不同为真(true)
true ^ true = false
true ^ false = true
false ^ true = true
false ^ false = false

! 取反 真取反为为假,假取反为真

&时,左边无论真假,右边都进行运算
&&时,如果左边为真,右边参与运算;如果左边为假,那么右边不参与运算
|: 左边无论真假,右边都参与运算
||:左边为假,右边参与运算;左边为真,右边不参与运算


位移运算符
<< :左移 其实就是乘以2的移动的位数次幂
>>:右移 就是除以2的移动的位数次幂

例子:
3<<2 : 3左移两位,先把3换成二进制,整体左移两位,低位空位补0,被移除的高位丢弃

3 的二进制: 00000000 00000000 00000000 00000011
左移两位后: 00000000 00000000 00000000 0000001100
所以 3<<2=12


6>>2: 6右移两位,先把6换成二进制,整体右移两位,若被移位的二进制最高位是0,右移后,高位空缺位补0;若被移位的二进制最高位是1,高位空缺位补1,被移除的低位丢弃。

6的二进制: 00000000 00000000 00000000 00000110
右移两位后: 00000000 00000000 00000000 0000000110
所以 6>>2 = 1


6的反码: 11111111 11111111 11111111 11111001
6的补码(-6的二进制): 11111111 11111111 11111111 11111010
右移两位后: 11111111 11111111 11111111 1111111010
所以 -6>>2 =-2

结论:**这里适用于正数,负数,感兴趣的可以自己研究**

往左移,越移越大;往右移,越移越小
正数:原码=反码=补码
负数:反码=原码取反 ; 补码=反码+1 ; -> 补码=原码的反码+1
       原码=补码的反码+1
负数以补码的形式存储在计算机中


3<<2=12;     3<<1=6;       3<<3=24;
3*4=12         3*2=6           3*8=24
3*2^2=12    3*2^1=6        3*2^3=8

往左移,移几位就是乘以2的几次方,这里只验证了正数,负数还未验证


6>>2=1        6>>1=3 
6/2^2=1       6/2^1=3; 

往右移,移几位就是除以2的几次方,这里只验证了正数,负数还未验证


注意:
	6>>2=1       -6>>2 =-2             6>>1=3   -6>>1=-3
	6/2^2=1      -6/2^2=-1             6/2^1=3  -6/2^1=-3

从这个例子可以看出,负数位移并不全部满足上述的规律。

发布了20 篇原创文章 · 获赞 2 · 访问量 3826

猜你喜欢

转载自blog.csdn.net/qq_43554951/article/details/94345477