进制
- 进制是一种进位的方式,x进制表示逢x进1.
不同进制的表示
- 二进制: 由0,1组成,以0b开头
- 八进制: 由0,1,...7组成,以0开头
- 十进制: 由0,1,...9组成, 默认为十进制
- 十六进制:由0,1,...9,a,b,c,d,e,f组成,以0x开头
进制转换
任意进制到十进制的转换
十进制 -----------------> 十进制
12345 = 1*10^4 + 2 *10^3 + 3*10^2 + 4*10^1 + 5*10^0 = 12345
二进制 -----------------> 十进制
100 = 1*2^2 + 0*2^1 + 0*2^0 = 4
八进制 -----------------> 十进制
100 = 1*8^2 + 0*8^1 + 0*8^0 = 64
十六进制 -----------------> 十进制
100 = 1*16^2 + 0*16^1 + 0*16^0 = 256
十进制到任意进制的转换
十进制 -----------------> 二进制
20 --------> 20 / 2 = 10 余数 0
10 / 2 = 5 余数 0
5 / 2 = 2 余数 1
2 / 2 = 1 余数 0
1 / 2 = 0 余数 1
= 0b1100
十进制二进制快速转换法
在这种编码方式中,每一位二值代码的“1”都代表一个固定数值。将每位“1”所代表的二进制数加起来就可以得到它所代表的十进制数字。因为代码中从左至右看每一位“1”分别代表数字“8”“4”“2”“1”,故得名8421码。
1 1 1 1 1 1 1 1
128 64 32 16 8 4 2 1
二进制到十进制转换,将每一位的1与上表中数值对应相加
1010100 = 64 + 16 + 4 = 84
十进制到二进制转换,将十进制数与上表比较,大于或等于即写1后面补其0
100 > 64 写 1 减64得36 36 > 32 写1 得4 4不大于16和8写0
1100100
二进制快速到八进制、十六进制、拆分组合法
- 二进制 ---------> 八进制
- 0b1011001 将三位二进制为一组拆分 计算出十进制制 组合
001 011 001
1 3 1
八进制为 0131
- 二进制 ---------> 十六进制
- 0b1011001 将四位二进制为一组拆分 计算出十进制制 组合
0101 1001
5 9
十六进制为 0x59
原码 反码 补码
- 在计算机内,所有数据运算都采用补码来操作的。
- 原码:就是二进制定点表示法,即最高位为符号为,0表示正,1表示负,其余表示数值。
- 反码:正数的反码与原码相同,负数的反码除了符号位,其他位逐位取反。
- 补码:正数的补码与原码相同,负数的补码是在其反码的末尾加1.
原码:
符号位 数值位
+7 0 0000111
-7 1 0000111
反码:
符号位 数值位
+7 0 0000111
-7 1 1111000
补码:
符号位 数值位
+7 0 0000111
-7 1 1111001
Java数据类型的默认转换(隐式转换)
boolean类型不能转换为其他数据类型- Java整型默认为
int类型,浮点型默认为double类型 byte、short、char类型在相互参与运算时会提升为int类型,返回也为int类型。- 如果参与运算的变量中有
long、float、double会首先提升为较大的类型参与运算。
逻辑与&、逻辑或|、逻辑异或^
- 逻辑
&左右两边都为true结果才为true - 逻辑
|左右两边有一个为true结果为true - 逻辑
^左右两边相同为flase,不同为true - 一个数据对另一个数据
^2次,结果不变a ^ b ^ b结果仍然为a
- 应用:不使用中间变量,交换2个变量的值
int a = 3;
int b = 9;
a = a ^ b; // 将 a ^ b 的值 保存在 a 中
b = a ^ b; // 这一步 取的是ab初始的值 相当于 a ^ b ^ b 将a的值保存在b中
a = a ^ b; // 此时b相当于原来的a值,这里相当于 原先的 a ^ b ^ a
System.out.println(a + ", " + b);
- 多个数按位
|的结果,将结果再按位&其中任何数,结果位仍为该数本身。
int a = 3, b = 9, d = 12;
int c = a | b | d;
System.out.println(c & a); // 3
System.out.println(c & b); // 9
System.out.println(c & d); // 12
左移<<、右移>>、无符号右移>>>
- 左移:对二进制数补码:左边最高位丢弃,右边补齐0
- 右移:对二进制数补码:最高位是0,左边补齐0,最高位是1,左边补齐1,右边丢弃
- 无符号右移:对二进制数补码:无论最高位是0或1,左边补齐0,右边丢弃
左移动:相当于作乘法,移动几位相当于乘以2的几次幂
3 >> 2
00000000 00000000 00000000 00000011
(00)000000 00000000 00000000 0000001100
可以得出结论左移相当于:3 * 2^2
右移动正数:相当于作除法,移动几位相当于除以以2的几次幂
24 >> 2 = 24 / 2^2 = 24 / 4 = 6
24 >>> 2 = 24 / 2^2 = 24 / 4 = 6
右移动负数: -24 >> 2
源码:10000000 00000000 00000000 00011000
反码:11111111 11111111 11111111 11100111
补码:11111111 11111111 11111111 11101000
11111111 11111111 11111111 11101000 补码右移2 ---->
11111111 11111111 11111111 11111010
补码:11111111 11111111 11111111 11111010
反码:11111111 11111111 11111111 11111001
原码:10000000 00000000 00000000 00000110
所以得出结果为 -6