go语言使用之进制相关

本篇文章主要介绍二进制、八进制、十进制和十六进制的基本概念和进制转换的操作。便于更好的理解计算机底层的编码,以及位移运算。

一、二进制在运算中的说明

二进制是逢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 

猜你喜欢

转载自blog.csdn.net/TDCQZD/article/details/81227000