进制就是进位计数制,是一种带进位的计数方法,即逢几进一。
生活中的进制:十进制(0~9)、七进制(星期)、十二进制(12小时制时间)、二十四进制(24小时制时间)、六十进制(分、秒)、二进制(1公斤=2斤)、十六进制(古代的1斤等于16两,即半斤八两)。
2. 常用进制| 进制种类 | 单词 | 范围 | 引导符号 | 实例 |
|---|---|---|---|---|
| 十进制 | decimal | 由0~9组成,共10个,逢十进一 | 无(Java中数字默认为十进制) | 10 |
| 二进制 | binary | 由0和1组成,共2个,逢二进一 | 0b或0B | 0b10 |
| 八进制 | octonary | 由0~7组成,共8个,逢八进一 | 0 | 010 |
| 十六进制 | hex | 由0~9、a-f或A-F组成,共16个,逢十六进一 | 0x或0X | 0x10 |
代码:
javase/src/code02/Test07.java:
package code02;
public class Test07 {
public static void main(String[] args) {
int a = 10;
int b = 0b10; // 二进制以0B开头
int c = 010; // 八进制以0开头
int d = 0x10; // 十六进制以0x开头
System.out.println(a);
System.out.println(b);
System.out.println(c);
System.out.println(d);
// 输出八进制和十六进制:使用"进制转义符 + System.out.printf"(不能使用"System.out.println",否则会报错)
System.out.printf("%o", d); // %o为八进制转义符,d表示要输出的值
System.out.println();
System.out.printf("%xn", c); // %x为十六进制转义符,n表示换行,c表示要输出的值
System.out.printf("%o,%dn", d, c); // 可以同时使用多个进制转义符,"进制转义符"和"要输出的值"从左至右依次匹配
// System.out.printf("%o,%d", c); // 必须为每个进制转义符都指定一个"要输出的值",否则程序运行时会报错
// 输出二进制:使用"Integer.toBinaryString(x)",x为要输出的值
System.out.println(Integer.toBinaryString(b)); // 暂时记住该代码
}
}
java执行结果:
3. 进制转换十进制转换为其他进制:除基取余,如十进制数转换为二进制:
其他进制转换为十进制:按权相加,如:
4. 二进制计算机最底层使用的是二进制,所以数据在计算机最底层都是以二进制形式保存的。
二进制数分为两种:
-
无符号二进制,只能存储正整数。
-
有符号二进制,可以存储正数和负数,最高位(最左边)为符号位,0表示正数,1表示负数,如:
正数5表示为:00000000 00000000 00000000 00000101。
负数-5表示为:10000000 00000000 00000000 00000101。
二进制中的原码、补码、反码:
-
原码
原始二进制值。
-
反码
正数:反码和原码相同,如5的原码为:00000000 00000000 00000000 00000101,反码仍为00000000 00000000 00000000 00000101。
负数:符号位不变,其余各位取反,如-5的原码为:10000000 00000000 00000000 00000101,反码为11111111 11111111 11111111 11111010。
-
补码
正数:补码和原码相同。
负数:反码+1,如-5的补码:11111111 11111111 11111111 11111011。
总结:
-
对于正数,原码、补码、反码都相同。
-
对于负数有所不同。
计算机内部都是用补码来存储和表示值的。
代码:
javase/src/code02/Test08.java:
package code02;
public class Test08 {
public static void main(String[] args) {
System.out.println(0b00000000000000000000000000000101);
System.out.println(0b11111111111111111111111111111011);
}
}
java执行结果:
5. 位运算符主要针对二进制的位的运算,需要将值转换为二进制后进行按位运算。
| 运算符 | 含义 |
|---|---|
| & | 按位与 |
| | | 按位或 |
| ~ | 按位非 |
| ^ | 异或 |
| >> | 右移 |
| << | 左移 |
| >>> | 无符号右移(了解) |
代码:
javase/src/code02/Test09.java:
package code02;
public class Test09 {
public static void main(String[] args) {
int a = 5; // 二进制为00000000 00000000 00000000 00000101
int b = 8; // 二进制为00000000 00000000 00000000 00001000
// 与:两位都为1,则为1,否则为0
System.out.println(a & b); // 00000000 00000000 00000000 00000000
// 或:只要有一个1,则为1,否则为0
System.out.println(a | b); // 00000000 00000000 00000000 00001101
// 非:如果为1,则为0;如果为0,则为1
System.out.println(~a); // 11111111 11111111 11111111 11111010
System.out.println(~a + 1); // -5的补码
// 异或:如果两位相同,则为0,不同则为1
System.out.println(a ^ b); // 00000000 00000000 00000000 00001101
// 左移:将二进制的所有位都向左移动指定的位数,末尾补0
System.out.println(a << 2); // 00000000 00000000 00000000 00010100
// 右移:将二进制的所有位都向右移动指定的位数,高位补符号位
System.out.println(a >> 2); // 00000000 00000000 00000000 00000001
System.out.println(-a >> 2); // 11000000 00000000 00000000 00000001
// 无符号右移:将二进制的所有位都向右移指定的位数,高位补0
System.out.println(-a >>> 2); // 00000000 00000000 00000000 00000001
System.out.println("-------------------------------------");
// 位运算是非短路运算
int i = 1;
boolean bool = false & (i = 2) == 5 & true; // 左边虽然为false,但还是会继续执行右边的代码
System.out.println(i);
System.out.println(bool);
}
}
java执行结果:
6. 位运算符和逻辑运算符的区别逻辑运算符:
-
逻辑运算符针对布尔值进行运算。
-
短路运算。
位运算符:
- 位运算符是针对二进制的位进行运算。
- 非短路运算。
代码:
javase/src/code02/Test10.java:
package code02;
public class Test10 {
public static void main(String[] args) {
int a = 4; // 00000000 00000000 00000000 00000100
int b = 6; // 00000000 00000000 00000000 00000110
// x ^ y = z => x = z ^ y, y = z ^ x (=>表示可以得到)
a = a ^ b; // 00000000 00000000 00000000 00000010
b = a ^ b; // 00000000 00000000 00000000 00000100
a = a ^ b; // 00000000 00000000 00000000 00000110
// 位运算符的执行效率在所有运算符中最高(原因:数据在计算机底层以二进制形式保存,位运算符直接针对二进制的位进行运算)
System.out.println(a);
System.out.println(b);
}
}
java执行结果:



