【golang笔记】go_二进制计算(5)
Page content
这一篇简单的整理了golang二进制计算相关的内容。
1.进制概述
- 二进制:0,1 满2进1。 golang中不能直接使用二进制来表示一个整数。
- 八进制:0~7 满8进1。以 0 开头。
- 十进制:0~9 满10进1。
- 十六进制:0~F 满16进1。以0x 开头。
2.进制转换
2.1 其它转十进制
二进制 => 十进制
规则:从低位开始(右边),把每个位提出来乘2的(位数-1)次方后求和。
二进制:1011 = (1 * 1) + (1 * 2) + (1 * 2 * 2) = 1 + 2 + 0 + 8 = 11
十进制:125 = 5 * 1 + 2 * 10 + 1 * 10 * 10 = 5 + 20 + 100 = 125
八进制 => 十进制
规则:从低位开始(右边),把每个位提出来乘8的(位数-1)次方后求和。
0123 = 3 * 1 + 2 * 8 + 1 * 8 * 8 = 3 + 16 + 64 = 83
十六进制 => 十进制
规则:从低位开始(右边),把每个位提出来乘16的(位数-1)次方后求和。
0x34B = 11 * 1 + 4 * 16 + 3 * 16 * 16 = 11 + 64 + 768 = 843
2.2 十进制转其它进制
规则:将数字不断除于2(8或16),直到商为0,然后把每步得到到余数倒过来拼接。
2.3 二进制转其它进制
二进制 => 八进制
规则:将二进制的没三位一组(从低位开始组合),转成对应的八进制。
11010101 => 11 010 101 => 3 2 5 = 0325
二进制 => 十六进制
规则:将二进制的没四位一组(从低位开始组合),转成对应的十六进制。
11010101 => 1101 0101 => D 5 = 0xD5
2.4 其它进制转二进制
八进制 => 二进制
规则:将八进制的每一位,转成对应的一个3位的二进制。
0237 => 10 011 111 = 10011111
十六进制 => 二进制
规则:将十六进制的每一位,转成对应的一个4位的二进制。
0x237 => 10 0011 0111 = 1000110111
3.源码,反码,补码
- 二进制的最高位是代表符号,0 代表证书,1 代表负数
1 => [0000 0001]
-1 => [1000 0001]
- 正数的原码,反码,补码 都一样
- 负数的反码是 符号位不变,其它取反(0 -> 1 1 -> 0)
- 负数的反码是 = 它的反码 + 1
- 0的反码,补码都是 0
1 => 原码 [0000 0001] 反码 [0000 0001] 补码 [0000 0001]
-1 => 原码 [1000 0001] 反码 [1111 1110] 补码 [1111 1111]
- 在计算机运算的时候,都是以补码的方式来运算。
1 - 1 => 1 + (-1)
4.位运算符和移位运算符
4.1 位运算符
&
按位与 => 两位全为 1,结果为 1,否则为 0
|
按位或 => 两位有一个为1,结果为1,否则为 0
^
按位异或 => 两位一个为0,一个为1,结果为1,否则为 0
2 & 3
2的补码 0000 0010
3的补码 0000 0011
2 & 3 0000 0010 => 2
2 | 3
2的补码 0000 0010
3的补码 0000 0011
2 | 3 0000 0011 => 3
2 ^ 3
2的补码 0000 0010
3的补码 0000 0011
2 ^ 3 0000 0000 => 1
负数的计算
-2 ^ 2
-2的原码 1000 0010 => 反码 1111 1101 => 补码 1111 1110
2的补码 0000 0010
-2的补码 1111 1110
-2 ^ 2 1111 1100(补码) => 原码
1111 1100(补码)=> 1111 1011(反码)=> 1000 0100(原码)=> 4
4.2 位移运算符
>>
左移运算符:低位溢出,符号位不便,并用符号位补溢出的高位。
<<
右移运算符:符号位不变,低位补0
1 >> 2
0000 0001 >> 0000 0000 = 0
1 << 2
0000 0001 >> 0000 0100 = 4
欢迎大家的意见和交流
email: li_mingxie@163.com