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,否则为0
- 按位或|:两位有一个为1,结果为1,否则为0
- 按位异或^:两位一个为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 移位运算
右移和左移,运算规则:
- 右移运算符:>> 低位溢出,符号位不变,并用符号位补溢出的高位
- 左移运算符:<< 符号位不变低位补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)

浙公网安备 33010602011771号