Go语言基础 -- 进制,机制转换,原码,反码,补码,位运算详解

1. 进制

1.1 二进制

每一位只能是0或1 ,满2进1

在Golang中不能直接使用二进制来表示一个整数,沿用了c的特点

package main

import "fmt"

func main() {
	var i int = 5
	fmt.Printf("%b",i)  // 101,int为1字节,8位, 其实应该是0000 0101
}

1.2 十进制

每一位只能是0-9,满10进1,从0开始

package main

import "fmt"

func main() {
	var i int = 9
	fmt.Println(i)  // 9
    var j int = 10
	fmt.Println(i)  // 10
}

1.3 八进制

每一位只能是0-7,满8进1,以数字0开头表示

package main

import "fmt"

func main() {
	var i int = 011
	fmt.Println(i)  // 9
}

1.4 十六进制

0-9及A-F,满16进1,以0x或0X开头表示,A-F不区分大小写

package main

import "fmt"

func main() {
	var i int = 0x11f
	fmt.Println(i)   // 287
}

2. 进制的转换规则

2.1 其他进制转十进制

2.1.1 二进制转十进制

规则:从最低位开始(最右边的),依次乘以2的0次方,1次方,2次方,然后求和
例如:1011转成十进制

1011 = 1 *2的3次方 + 0 * 2的2次方 + 1 * 2的1次方 + 1 *2的0次方
1011 =  8   + 0 + 2 + 1 = 11

十进制是如何算出来的?
例如 134转成十进制

134 = 1 * 10的2次方 + 3 * 10的1次方 + 4 * 10的0次方
134 = 100 + 30 + 4

2.1.2 八进制转十进制

规则:从最低位开始(最右边的),依次乘以8的0次方,1次方,2次方,然后求和
例如:

0123 = 0 * 8的3次方 + 1 * 8的2次方 + 2 * 8的1次方 + 3 * 8的0次方
0123 = 0 + 64 + 16 + 3 = 83

2.1.3 十六进制转十进制

规则:从最低位开始(最右边的),依次乘以16的0次方,1次方,2次方,然后求和
例如:

0x34A = 3 * 16的2次方 + 4 * 16的1次方 + 10 * 16的0次方
0x34A = 768 + 64 +10 = 842

2.2 十进制转其他进制

2.2.1 十进制转成二进制

规则:将该数不断的除以2,直到商为0,然后倒着取每步的余数
例如:56转二进制

56/2,商28,余0
28/2,商14,余0
14/2,商7,余0
7/2,商3,余1
3/2,商1,余1
1/2,商0(不可商),余1
56 = 111000

2.2.2 十进制转成八进制

规则:将该数不断的除以8,直到商为0,然后倒着取每步的余数
例如:156转八进制

156/8,商19,余4
19/8,商2,余3
2/8,商0,余2
156 = 0234    // 八进制以0开头

2.2.3 十进制转成十六进制

规则:将该数不断的除以16,直到商为0,然后倒着取每步的余数
例如:356转十六进制

356/16,商22,余4
22/16,商1,余6
1/16,商0,余1
156 = 0x164    // 十六进制以0x开头

2.3 二进制转其他进制

2.3.1 二进制转八进制

规则:将二进制每三位一组(从最低位,最右边开始),转成对应的八进制
例如:11010101转成八进制

11010101 = 3(011)  2(010)  5(101) = 0325

2.3.2 二进制转十六进制

规则:将二进制每四位一组(从最低位,最右边开始),转成对应的八进制
例如:11010101转成十六进制

11010101 =  13(1101)  5(0101) = 0xD5

2.4 其他进制转二进制

2.4.1 八进制转二进制

规则:将八进制的每一位,转成对应的一个3位的二进制
例如:0237转成二进制

0237=10011111

2.4.2 十六进制转二进制

规则:将八进制的每一位,转成对应的一个4位的二进制
例如:0x237转成二进制

0x237 = 1000110111

3. 位运算

3.1 基础理论

二进制是逢2进位的进位制,0,1是基本算符
现代的电子计算机技术全部采用的是二进制,因为它只有0,1两个数字符号,非常的简单方便,易于用电子方式实现,计算机内部处理的信息,都是采用二进制数来表示的,二进制(Binary)数用0和1两个数字及其组合来表示任何数,进位规则是"逢二进一",数字1在不同的位上表示的值不同,按从右至左的次序,这个值以2倍递增

3.2 原码,反码,补码

3.2.1 如何计算原码,反码,补码

1.二进制的最高位是符号位:0代表整数,1代表负数

1 [0000 0001] -1 [1000 0001]

2.正数的原码,反码,补码都一样

数字 1 为正数  原码为 [0000 0001]
数字 1 为正数  反码为 [0000 0001]
数字 1 为正数  补码为 [0000 0001]

3.负数的反码=它的原码符号位不变,其他位位取反(0-->1,1-->0)

数字 -1 为负数  原码为 [1000 0001]
数字 -1 为负数  反码为 [1111 1110]

4.负数的补码=它的反码+1

数字 -1 为负数  原码为 [1000 0001]
数字 -1 为负数  补码为 [1111 1111]

5. 0的反码,补码都是0
6. 在计算机运算的时候,都是以补码的方式来运算的

在计算机中没有减法:1 - 1 = 1 + (-1)

3.2.2 位运算

Golang中有3个位运算,分别是"按位与& 按位或| 按位异或^ ,运算规则为:"

  1. 按位与&: 两位全为1,结果为1,否则为0
  2. 按位或|:两位有一个为1,结果为1,否则为0
  3. 按位异或^:两位一个为0,一个为1,结果为1,否则为0

例如:

// 计算机的计算方式都是按照补码的方式计算的,正数的补码和原码一样
2&3=0000 0010 & 0000 0011 = 0000 0010(2)
2|3=0000 0010 | 0000 0011 = 0000 0011(3)
2^3=0000 0010 ^ 0000 0011 = 0000 0001(1)

// 计算机的计算方式都是按照补码的方式计算的,负数的补码=反码+1

-------------原码---------------反码----------------------补码---------------------得出结果仍是补码---------原码
-2&3=1000 0010 & 0000 0011 = 1111 1101 & 0000 0011 =  1111 1110 & 0000 0011 =    0000 0010  =      0000 0010(2)
-2|3=1000 0010 | 0000 0011 = 1111 1101 | 0000 0011 =  1111 1110 | 0000 0011 =    1111 1111  =      补码(1111 1111) - 1 求出反码(1111 1110) 反码取反得出原码 1000 0001(-1)
-2^3=1000 0010 ^ 0000 0011 = 1111 1101 ^ 0000 0001 =  1111 1110 ^ 0000 0011 =    1111 1101  =      补码(1111 1101) - 1 求出反码(1111 1100) 反码取反得出原码 1000 0011(-3)

3.2.3 移位运算

右移和左移,运算规则:

  1. 右移运算符:>> 低位溢出,符号位不变,并用符号位补溢出的高位
  2. 左移运算符:<< 符号位不变低位补0

例如:

a := 1>>2
// 1是正数,原码反码补码都一样:0000 0001 ,向右移动两位:将01,溢出(00 0000),符号位补溢出高位得出补码(0000 0000),再求原码(0000 0000 =>转成十进制后 0)


c := 1<<2
// 1是正数,原码反码补码都一样:0000 0001 ,向左移动两位:将00,溢出(0000 01),符号位不变,低位补0得出补码(0000 0100),再求原码(0000 0100 =>转成十进制后 4)
posted @ 2021-08-27 09:59  河图s  阅读(874)  评论(0)    收藏  举报