计算机语言本质存储为1和0的二进制,但常用的还有八进制、十进制、十六进制等进制类型数据。由于生活中大家对十进制的接触最多、也最了解,所以本文不在对十进制进行赘述。
二进制
1、二进制初见
- 二进制是以0和1为码,逢2进1,比如3(十进制)=11(二进制)=1*2+1。
- 在计算机当中其它进制的算法基本基于2进制,因为计算机只认识0和1,比如16进制数则意味着一位16进制码由4位2进制码数表示。
- 在Java语言中byte代表最小计量单位,byte由8位2进制数组成。
2、二进制与编码
- 一般对英文字符而言,一个字节表示一个字符,但是对汉字而言,由于低位的编码已经被使用(早期计算机并不支持中文,因此为了扩展支持,唯一的办法就是采用更多的字节数)只好向高位扩展。
- 一般字符集编码的范围 utf-8>gbk>iso-8859-1(latin1)>ascll。ascll编码是美国标准信息交换码的英文缩写,包含了常用的字符,如阿拉伯数字,英文字母和一些打印符号,请注意字符和数字的区别,比如'0'字符对应的十进制数字是48。
- unicode编码包含很多种格式,utf-8是其中最常用的一种,utf-8名称的来自于该编码使用8位一个字节表示一个字符。对于一个汉字而言,它需要3个字节表示一个汉字,但大中华地区人民表示不服,搞一套gbk编码格式,用两个字节表示一个汉字。
3、二进制相关计算
(1)、二进制按位与运算 &
// 与运算: 0与任何数字运算为0,只有两个1与运算才为1
1 & 1 = 1
0 & 1 = 0
51 & 5 即 0011 0011 & 0000 0101 =0000 0001 = 1
(2)、按位或运算 |
// 或运算: 1与任何数字进行或运算都为1,只有两个0进行或运算才为0
1 | 0 = 1
1 | 1 = 1
0 | 0 = 0
51 | 5 即 0011 0011 | 0000 0101 =0011 0111 =55
(3)、异或运算 ^
// 异或运算: 两个位的值不同,则结果为1,相同结果为0
1 ^ 1 = 0
1 ^ 0 = 1
0 ^ 0 = 0
51 ^ 5 即 0011 0011 ^0000 0101 =0011 0110=54
(4)、<<左移运算符
将一个运算对象的各二进制位全部左移若干位(左边的二进制丢弃,右边补0)
11 << 2 = 44
-14 <<2 =-56
-14的二进制(11111111 11111111 11111111 11110010)左移2位
00
结果为(-56)
负数在二进制中如何表示(负数以正数的补码表示)
原码:一个整数按照绝对值的大小转化成二进制的数
反码:将二进制数按位取反
补码:反码加 1
以-14 举例
原码 14 即 00000000 00000000 00000000 00001110
反码 11111111 11111111 11111111 11110001
补码 11111111 11111111 11111111 11110010
所以-14 的二进制是 11111111 11111111 11111111 11110010
假设 我们得到 二进制让我们求整数 就是倒着来取相反数
二进制是 11111111 11111111 11111111 11110010
得到反码减1 11111111 11111111 11111111 11110001
原码 00000000 00000000 00000000 00001110
即 1110 = 14 所以取反 就是-14
(5)、>>右移运算符
将一个运算对象的各二进制位全部右移若干位,正数左补0,负数左补1.
4 >> 2 = 1;
-14 >> 2 = -4;
八进制
八进制,Octal,缩写OCT或O,一种以8为基数的计数法,采用0,1,2,3,4,5,6,7八个数字,逢八进1。
Java语言在声明一个数字为八进制时,需要在数字前面加0,即(0123表示为八进制,但123标识十进制)
int a = 100; // 表示为十进制100
int a = 0144; // 表示八进制100
千万记住,用八进制表达时,你不能少了最前的那个0。否则计算机会通通当成10进制。不过,有一个地方使用八进制数时,却不能使用加0,那就是我们前面学的用于表达字符的“转义符”表达法
由于八进制在以后的开发中使用的并不是很多,所以在此只给大家做一个简单的介绍,有兴趣的读者可以自行学习。
十六进制
十六进制(简写为hex或下标16)在数学中是一种逢16进1的进位制。一般用数字0到9和字母A到F(或a~f)表示,其中:A~F表示10~15,这些称作十六进制数字。
注意:十六进制逢十六进一,一般情况下,计算机1对6进制数也会和10进制相混。
16进制数必须以 0x开头。比如 0x1表示一个16进制数。而1则表示一个十进制。另外如:0xff,0xFF,0X102A,等等。其中的x也不区分大小写。(注意:0x中的0是数字0,而不是字母O)
int a = 0x100F;
int b = 0x70 + a;
进制之间的转换(Java API)
1、十进制转换其他进制算法
int number = 25;
//十进制转成十六进制:
String a = Integer.toHexString(number);
System.out.println(a); //19
//十进制转成八进制
String b = Integer.toOctalString(number);
System.out.println(b); //31
//十进制转成二进制
String c = Integer.toBinaryString(number);
System.out.println(c); //11001
2、其他进制之间的转换
String binary = "101011";
//二进制转十进制
Integer.valueOf(binary, 2).toString(); // 43
//二进制转八进制
Integer.toOctalString(Integer.parseInt(binary, 2)); // 53
//二进制转十六进制
Integer.toHexString(Integer.parseInt(binary, 2)); // 2b
String octal = "520";
//八进制转成十进制
Integer.valueOf(octal, 8).toString(); // 336
//八进制转成二进制
Integer.toBinaryString(Integer.valueOf(octal, 8)); // 101010000
//八进制转成十六进制
Integer.toHexString(Integer.valueOf(octal, 8)); // 150
String hex = "FA";
//十六进制转成十进制
Integer.valueOf(hex, 16).toString();
//十六进制转成二进制
Integer.toBinaryString(Integer.valueOf(hex, 16));
//十六进制转成八进制
Integer.toOctalString(Integer.valueOf(hex, 16));
最后,进制问题会贯彻到整个计算机的脉络