本篇文章主要介绍二进制、八进制、十进制和十六进制的基本概念和进制转换的操作。便于更好的理解计算机底层的编码,以及位移运算。
一、二进制在运算中的说明
二进制是逢2进位的进位制,0、1是基本算符。
现代的电子计算机技术全部采用的是二进制,因为它只使用0、1两个数字符号,非常简单方便,易于用电子方式实现。计算机内部处理的信息,都是采用二进制数来表示的。二进制(Binary)数用0和1两个数字及其组合来表示任何数。进位规则是“逢2进1”,数字1在不同的位上代表不同的值,按从右至左的次序,这个值以二倍递增。
在计算机的内部,运行各种运算时,都是以二进制的方式来运行。
二、进制介绍
1、对于整数,有四种表示方式:
二进制:0,1 ,满2进1。
十进制:0-9 ,满10进1。
八进制:0-7 ,满8进1. 以数字0开头表示。
十六进制:0-9及A-F,满16进1. 以0x或0X开头表示。
说明:此处的A-F不区分大小写,如:0x21AF +1= 0X21B0
2、二进制的图示
十进制 | 十六进制 | 八进制 | 二进制 |
---|---|---|---|
0 | 0 | 1 | 0000 0000 |
1 | 1 | 1 | 0000 0001 |
2 | 2 | 2 | 0000 0010 |
3 | 3 | 3 | 0000 0011 |
4 | 4 | 4 | 0000 0100 |
5 | 5 | 5 | 0000 0101 |
6 | 6 | 6 | 0000 0110 |
7 | 7 | 7 | 0000 0111 |
8 | 8 | 10 | 0000 1000 |
9 | 9 | 11 | 0000 1001 |
10 | A | 12 | 0000 1010 |
11 | B | 13 | 0000 1011 |
12 | C | 14 | 0000 1100 |
13 | D | 15 | 0000 1101 |
14 | E | 16 | 0000 1110 |
15 | F | 17 | 0000 1111 |
16 | 10 | 20 | 0001 0000 |
17 | 11 | 21 | 0001 0001 |
三、进制的转换
1、第一组(其它进制转十进制):
二进制转换成十进制示例
规则:从最低位开始(右边的),将每个位上的数提取出来,乘以2的(位数-1)次方,然后求和。
案例:请将 二进制:1011 转成十进制的数
1011 = 1 * 2的0次方 + 1 * 2 + 0 * 2 * 2 + 1 * 2 * 2 * 2 = 1 + 2 + 0 + 8 = 11
八进制转换成十进制示例
规则:从最低位开始(右边的),将每个位上的数提取出来,乘以8的(位数-1)次方,然后求和。
案例:请将 0123 转成十进制的数
0123 = 3 + 2 * 8 + 1 * 8 * 8 = 3 + 16 + 64 = 83
16进制转换成十进制示例
规则:从最低位开始,将每个位上的数提取出来,乘以16的(位数-1)次方,然后求和。
案例:请将 0x34A 转成十进制的数
0x34A = 10 + 4 * 16 + 3 * 16 * 16 = 842
2、第二组:(十进制转其它进制)
十进制转换成二进制
规则:将该数不断除以2,直到商为0为止,然后将每步得到的余数倒过来,就是对应的二进制。
案例:请将 56 转成二进制
56->0011 1000
十进制转换成八进制
规则:将该数不断除以8,直到商为0为止,然后将每步得到的余数倒过来,就是对应的八进制。
案例:请将 156 转成八进制
156 ->0234
十进制转换成十六进制
规则:将该数不断除以16,直到商为0为止,然后将每步得到的余数倒过来,就是对应的十六进制。
案例:请将 356 转成十六进制
356->0X164
3、第三组 (二进制转其它进制)
二进制转换成八进制
规则:将二进制数每三位一组(从低位开始组合),转成对应的八进制数即可。
案例:请将 二进制:11010101 转成八进制
11010101 = 0325
二进制转换成十六进制
规则:将二进制数每四位一组(从低位开始组合),转成对应的十六进制数即可。
案例:请将 二进制:11010101 转成十六进制
11010101 = 0xd5
4、第四组 (其它进制转二进制)
八进制转换成二进制
规则:将八进制数每1位,转成对应的一个3位的二进制数即可。
案例:请将 0237 转成二进制
0237 = 10011111
十六进制转换成二进制
规则:将十六进制数每1位,转成对应的一个4位的二进制数即可。
案例:请将 0x237 转成二进制
0x237 = 1000110111
四、原码、反码、补码
网上对原码,反码,补码的解释过于复杂,这里只需记住以下六条:
对于有符号的而言:
二进制的最高位是符号位: 0表示正数,1表示负数
[1: 0000 0001 -1 :1000 0001 ]
2) 正数的原码,反码,补码都一样
[1:原码 0000 0001 , 反码 0000 0001 , 补码 0000 0001 ]
3) 负数的反码=它的原码符号位不变,其它位取反(0->1,1->0)
[举例: -1 : 原码 1000 0001 反码 1111 1110 ]
4) 负数的补码=它的反码+1
【举例: -1 : : -1 : 原码 1000 0001 反码 1111 1110 补码 1111 1111】
5) 0的反码,补码都是0
6) 在计算机运算的时候,都是以补码的方式来运算的.
[1+1 => 1的补码+1的补码 1-1: 1的补码 + (-1的补码)]
五、go语言中的与进制有关的运算符
1、位运算符和移位运算符
Golang中有3个位运算
位运算说明
分别是”按位与&、按位或|、按位异或^,它们的运算规则是:
按位与& : 两位全为1,结果为1,否则为0
按位或| : 两位有一个为1,结果为1,否则为0
按位异或 ^ : 两位一个为0,一个为1,结果为1,否则为0
位运算案例
比如:2&3=? -2&-3
2&3=? -2&-3 【位运算】
2 & 3
2 补码 0000 0010
3 补码 0000 0011
0000 0010
0000 0011
& 0000 0010 =》 这个是运算的补码结果 ====》 转成 原码 ===》 & 0000 0010
结果是 2
-2&3
-2 的补码:
-2 的原码 1000 0010
-2 的反码 1111 1101
-2 的补码 1111 1110
3 的补码 0000 0011
1111 1110
0000 0011
& 0000 0010 =>2
-2&-3
-2 的补码:
-2 的原码 1000 0010
-2 的反码 1111 1101
-2 的补码 1111 1110
-3 的补码
-3 的原码 1000 0011
-3 的反码 1111 1100
-3 的补码 1111 1101
1111 1110
1111 1101
& 1111 1100 => 补码 ==》 反码 (补码-1) 1111 1011 => 原码 1000 0100 =》-4
2、位运算符和移位运算符
Golang中有2个移位运算符:
>>、<< 右移和左移,运算规则:
右移运算符 >>:低位溢出,符号位不变,并用符号位补溢出的高位
左移运算符 <<: 符号位不变,低位补0
a := 1 >> 2 // 0
1 的补码 0000 0001 => 0000 0000
c := -1>> 2 //-1
-1 的补码 1111 1111 => 1111 1111 (补码) ==> 1111 1110 => 1000 0001