【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,然后把每步得到到余数倒过来拼接。

图片备用地址
hadoop_01

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.源码,反码,补码

  1. 二进制的最高位是代表符号,0 代表证书,1 代表负数
 1 => [0000 0001]  
-1 => [1000 0001]  
  1. 正数的原码,反码,补码 都一样
  2. 负数的反码是 符号位不变,其它取反(0 -> 1 1 -> 0)
  3. 负数的反码是 = 它的反码 + 1
  4. 0的反码,补码都是 0
 1 => 原码 [0000 0001] 反码 [0000 0001] 补码 [0000 0001]  
-1 => 原码 [1000 0001] 反码 [1111 1110] 补码 [1111 1111]  
  1. 在计算机运算的时候,都是以补码的方式来运算。
    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