1、进制与转换
1 byte = 8 bit
-3用二进制表示:
0000 0011 #3
1111 1100 #按位取反
1111 1101 #加1
小数十进制与二进制转换
二进制——>十进制:按权相加(310.01=3x2^2+1x2^1+0x2^0+0x2^-1+1x2^-2)
十进制——>二进制:整数部分:除2取余,倒序排列;
小数部分:乘2取整,顺序排列。(0.625——>0.101)
数据类型转换例子(boolean类型不能转换为任何其他数据类型)
short s = 1;
s = s + 1; #报错! 因为等式右边s+1会自动转化为int类型的数据,而左边为short类型,可能存在精度确实
s += 1; #注意!此时不会报错
int s = s + 1 #正确
自增(b++先赋值后自增,++b先自增后赋值)
int a=1;
int b=2;
// b = a + b - (++b) #b=0
// a = ++a + (b--) + (a-b) + b #6:2+2+(2-1)+1
与(或)和短路与(或)(顺序不同)
短路与:&& false && true :false
短路或:|| false || ture :true
// &:在逻辑运算中分别计算表达式两边的结果,再做&运算,在做位运算时表示按位与
// &&:先计算左边表达式,如果左边false直接返回false,如果左边为true则再计算右边进行判断
// | :在逻辑计算中分别计算表达式两边的结果,再做|运算,在做位运算时表示按位或
// ||:先计算左边表达式,如果左边为true直接返回true,如果左边为false则再计算右边进行判断
(所以短路与、或效率更高,建议使用)
位运算(效率高)
左移:a<<b,将二进制的a逐位左移b位,最低位空出的b位补0
带符号右移:a>>b,将二进制形式的a逐位右移b位,最高位空出的b位补原来的符号位
无符号右移:a>>>>b,将二进制形式的a逐位右移b位,最高位空出的b位补0
100: 00000000 00000000 00000000 01100100
-100: 11111111 11111111 11111111 10011100
-100<<3: 11111111 11111111 11111100 11100000
-100>>3: 11111111 11111111 11111111 11110011
-100>>>>3: 00011111 11111111 11111111 11110011
~面试:以最快的速度计算8*4
0000 1000 //8
0010 0000 //32
所以:int result = 8<
原理:
左移:位移数作为2的次幂与操作数相乘(10<
右移:操作数除以位移数的2次幂(40>>2=10)
~面试:如何不通过第三个变量交换两个数
(1)利用表达式: a = a + b - (b=a);
(2) 通过+-: a=a+b; b=a-b; a=a-b;(可能溢出)
(3)通过乘除:a=a*b; b=a/b a=a/b;(可能溢出)
(4)位运算(最快的!):a=a^b; b=a^b; a=a^b;(a,b不能相同)