进制
-
介绍
对于整数,有四种表示方法:
- 二进制:0,1,满2进1,以0b或0B开头。
- 十进制:0-9,满10进1.
- 八进制:0-7,满8进1,以数字0开头表示。
- 十六进制:0-9及A(10)-F(15),满16进1.以0x或0X开头表示。此处的A-F不区分大小写。
-
举例
//n1 二进制 int n1 = 0b1010; //n2 十进制 int n2 = 1010; //n3 八进制 int n3 = 01010; //n4 十六进制 int n4 = 0x10101; System.out.println("n1=" + n1);//n1=10 System.out.println("n2=" + n2);//n2=1010 System.out.println("n3=" + n3);//n3=520 System.out.println("n4=" + n4);//n4=65793
-
进制的图示
十进制 十六进制 八进制 二进制 0 0 0 0 1 1 1 1 2 2 2 10 3 3 3 11 4 4 4 100 5 5 5 101 6 6 6 110 7 7 7 111 8 8 10 1000 -
进制的转换
-
第一组
-
十六进制 → 十进制
- 规则
- 从最低位(右边)开始,将每个位上的数提取出来,乘以16的(位数-1)次方,然后求和
- 案例
- 0x23A = 10 * 16^0 + 3 * 16^1 + 2 * 16^2 = 10 + 48 + 512 = 570
- 规则
-
八进制 → 十进制
- 规则
- 从最低位(右边)开始,将每个位上的数提取出来,乘以8的(位数-1)次方,然后求和
- 案例
- 0234 = 4 * 8^0 + 3 * 8^1 + 2 * 8^2 + 0 * 8^3 = 4 + 24 + 128 = 156
- 规则
-
二进制 → 十进制
- 规则
- 从最低位(右边)开始,将每个位上的数提取出来,乘以2的(位数-1)次方,然后求和
- 案例
- 0b1011 = 1 * 2^0 + 1 * 2^(2-1) + 0 * 2^(3-1) + 1 * 2^(4-1) = 1 + 2 + 0 + 8 = 11
- 规则
-
-
第二组
-
十进制 → 二进制
- 规则
- 将该数不断除以2,直到商为0为止,然后将每步得到的余数倒过来,就是对应的二进制。
- 案例
- 34转成十进制:0B00100010
- 规则
-
十进制 → 八进制
- 规则
- 将该数不断除以8,直到商为0为止,然后将每步得到的余数倒过来,就是对应的二进制。
- 案例
- 131转成十进制:0203
- 规则
-
十进制 → 十六进制
- 规则
- 将该数不断除以16,直到商为0为止,然后将每步得到的余数倒过来,就是对应的二进制。
- 案例
- 237转成十进制:0xED
- 规则
-
-
第三组
-
二进制 → 八进制
- 规则
- 从低位开始,将二进制数每三位一组,转成对应的八进制数即可。
- 案例
- 0b11(3)010(2)101(5)转成八进制:0325
- 规则
-
二进制 → 十六进制
- 规则
- 从低位开始,将二进制数每四位一组,转成对应的十六进制数即可。
- 案例
- 0b1101(D)0101(5)转成八进制:0xD5
- 规则
-
-
第四组
-
八进制 → 二进制
- 规则
- 将八进制数每1位,转成对应的一个3位的二进制数即可
- 案例
- 02(010)3(011)7(111) 转成二进制:0b010011111
- 规则
-
十六进制 → 二进制
- 规则
- 将八进制数每1位,转成对应的一个4位的二进制数即可
- 案例
- 0x2(0010)3(0011)B (1011)转成二进制:0b001000111011
- 规则
-
-
二进制在运算中的说明
- 二进制是逢2进位的进位制,0、1是基本算符。
- 现代的电子计算机技术全部采用的是二进制,因为它只使用0、1两个数字符号,非常简单方便,易于用电子方式实现。计算机内部处理的信息,都是采用二进制数来表示的。
- 二进制(Binary)数用0和1两个数字及其组合来表示任何书。进位规则是“逢2进1”,数字1在不同的位上代表不同的值,按从右至左的次序,这个值以二倍递增。
-
原码、反码、补码(重点/难点)
-
二进制的最高位是符号位:0表示正数,1表示负数。
-
正数的原码、反码、补码都一样。(三码合一)
-
负数的反码 = 它的原码符号位不变,其他位取反。
-
负数的补码 = 它的反码 + 1
负数的反码 = 它的补码 -1
-
0的反码、补码都是0
-
Java没有无符号数。换言之,Java中的数都是有符号的。
-
在计算机运算的时候,都是以补码的方式来运算的。
-
当我们看运算结果的时候,要看他的原码。
-
-
位运算
-
按位与&、按位或|、按位异或^、按位取反~
按位与 & 两位全为1,结果为1,否则为0 按位或 两位有一个为1,结果为1,否则为0 按位异或 ^ 两位一个为0,一个为1,结果为1,否则为0 按位取反 ~ 0 → 1,1 → 0 -
案例
//1.先得到2的补码:00000000 00000000 00000000 00000010 //2.3的补码:00000000 00000000 00000000 00000011 //3.按位与 // 00000000 00000000 00000000 00000010 // 运算后的源码也是 00000000 00000000 00000000 00000010 // 结果就是2 System.out.println(2 & 3);//2 //1.先得到-2的原码:10000000 00000000 00000000 00000010 //2.-2的反码:11111111 11111111 11111111 11111101 //3.-2的补码:11111111 11111111 11111111 11111110 //4.~ -2操作:00000000 00000000 00000000 00000001运算后的补码 //5.运算后的原码就是 00000000 00000000 00000000 00000001 System.out.println(~-2);//1 /*1.得到2的补码:00000000 00000000 00000000 00000010 2. ~2操作 11111111 11111111 11111111 11111101 运算后的补码 3.运算后的反码 11111111 11111111 11111111 11111100 4.运算后的原码 10000000 00000000 00000000 00000011*/ System.out.println(~2);//-3
-
-
算数右移>>、算术左移<<、逻辑右移>>>
算数右移>> 低位溢出,符号位不变,并用符号位补溢出的高位 算术左移<< 符号位不变,低位补0 逻辑右移>>>(无符号右移) 低位溢出,高位补0 //1 → 00000000 00000000 00000000 00000001 //00000000 00000000 0000000 00000000 //本质:1 / 2 / 2 int a = 1 >> 2;//1 向右移 2位 int b = -1 >> 2;//算数右移 //1 → 00000000 00000000 00000000 00000001 // 00000000 00000000 00000000 00000100 //本质:1 * 2 * 2 int c = 1 << 2;//算数左移 int d = -1 << 2;//负数需要转换成补码 int e = 3 >>> 2;//无符号右移 System.out.println("a=" + a);//a=0 System.out.println("b=" + b);//b=-1 System.out.println("c=" + c);//c=4 System.out.println("d=" + d);//d=-4 System.out.println("e=" + e);//e=0
-
-
本章习题
//·a % b 当a是小数时,公式= a -(int)a / b * b
System.out.println(-10.5 % 3);//-1.5
//注意:有小数参与的运算,得到的结果是近似值
int i = 66;
System.out.println(++i + i);//134
int num1 = (int)"18";//× 应该Integer.parseInt("18");
int num2 18.0;//× double → int
double num3 = 3d;//√
double num4 = 8;//√ int → double
int i = 48; char ch = i + 1;//× int → char
byte b = 19;short s = b + 2;//× int → short
//写出将String转换成double类型的语句,以及将char类型转换成String的语句
String str = "18.8";//注意:字符串要可以转成 double
double d1 = Double.parseDouble(str);
char c1 = '易';
String str2 = c1 + "";