【Go 基础】进制转换与位运算

进制转换

其他进制转十进制

二进制转十进制

规则:从最低位开始(右边),将每个位上的数提取出来,乘以2的(位数-1)次方后求和。
示例:请将二进制1011转成十进制的数。

1011 = 1 * 2^0 + 1 * 2^1 + 0 * 2^2 + 1 * 2^3 = 11

八进制转十进制

规则:从最低位开始(右边),将每个位上的数提取出来,乘以8的(位数-1)次方后求和。
示例:请将二进制0123转成十进制的数。

0123 = 3 * 8^0 + 2 * 8^1 + 1* 8^2 = 83

十六进制转十进制

规则:从最低位开始(右边),将每个位上的数提取出来,乘以16的(位数-1)次方后求和。
示例:请将二进制0x34A转成十进制的数。

0x34A = 10 * 16^0 + 4 * 16^1 + 3 * 16^2 = 842

十进制转其他进制

十进制转二进制

规则:将该数不断除以2,直到商为0为止,然后将每步得到的余数倒过来,就是对应的二进制。
示例:请将56转成二进制。

56 = 111000

十进制转八进制

规则:将该数不断除以8,直到商为0为止,然后将每步得到的余数倒过来,就是对应的八进制。
示例:请将156转成八进制。

156 = 0234

十进制转十六进制

规则:将该数不断除以16,直到商为0为止,然后将每步得到的余数倒过来,就是对应的十六进制。
示例:请将356转成十六进制。

356 = 0x164

二进制转其他进制

二进制转换成八进制

规则:将二进制数每三位一组(从低位开始组合),转成对应的八进制数即可。
示例:请将二进制11010101转成八进制。

11010101 = 0325

二进制转换成十六进制

规则:将二进制数每四位一组(从低位开始组合),转成对应的十六进制数即可。
示例:请将二进制11010101转成十六进制。

11010101 = 0xD5

其他进制转二进制

八进制转换成二进制

规则:将八进制数每1位,转成对应的一个3位的二进制数即可。
示例:请将0237转成二进制

0237 = 10011111

十六进制转换成二进制

规则:将十六进制数每1位,转成对应的一个4位的二进制数即可。
示例:请将0x237转成二进制

0x237 = 1000110111

位运算

程序中的所有数在计算机内存中都是以二进制的形式储存的,位运算就是直接对整数在内存中的二进制位进行操作。相比在代码中直接使用(+、-、*、/)运算符,合理的运用位运算更能显著提高代码在机器上的执行效率。

位运算概览:

符号 描述 运算规则
& 两个位都为1时,结果才为1
| 两个位都为0时,结果才为0
^ 异或 两个位相同为0,相异为1
~ 取反 0变1,1变0
<< 左移 各二进位全部左移若干位,高位丢弃,低位补0
>> 右移 各二进位全部右移若干位,对无符号数,高位补0,有符号数,各编译器处理方法不一样,有的补符号位(算术右移),有的补0(逻辑右移)

数值在计算机中是以补码的方式存储的,在探求为何计算机要使用补码之前, 让我们先了解原码, 反码和补码的概念。

对于一个数, 计算机要使用一定的编码方式进行存储。 原码, 反码, 补码是计算机存储一个具体数字的编码方式。

总结如下:

  • 原码: 就是符号位加上真值的绝对值, 即用第一位表示符号, 其余位表示值。
  • 反码: 正数的反码是其本身;负数的反码是在其原码的基础上, 符号位不变,其余各个位取反。
  • 补码: 正数的补码就是其本身;负数的补码是在其原码的基础上, 符号位不变, 其余各位取反, 最后+1。 (即在反码的基础上+1)
  • 移码: 不管正负数,只要将其补码的符号位取反即可。

注意事项:

  • 二进制的最高位是符号位,0表示正数,1表示负数(记忆,1倒过来就是负数)。
  • 正数的原码、反码、补码都一样。
  • 负数的反码是原码符号位不变,其他位取反(0-1,1-0)。
  • 负数的补码为它的反码+1。
  • 0的反码,补码都是0。
  • 计算机运算的时候,都是以补码的方式来运算的,因此负数运算一定要用补码来进行运算。

示例:求2&3、2\|3、2^3

2&3 转换十进制:2
2的补码:0000 0010
3的补码:0000 0011
2&3运算:0000 0010
转换十进制:2

2\|3 转换十进制:3
2的补码:0000 0010
3的补码:0000 0011
2\|3运算:0000 0011
转换十进制:3

2^3 转换十进制:1
2的补码:0000 0010
3的补码:0000 0011
2^3运算:0000 0001

示例:求-2^2

-2的原码:1000 0010
-2的反码:1111 1101
-2的补码:1111 1110
2 的补码:0000 0010 
按位异或的补码:1111 1100
按位异或的反码(减1):1111 1011
按位异或的原码:10000 0100
转换十进制:-4

关于>>右移和<<左移移位运算规则:
右移运算符 >>:低位溢出,符号位不变,并用符号位补溢出的高位。
左移运算符 <<:符号位不变,低位补 0。

示例说明:

a := 1 >> 2  // 0000 0001 右移两位,低位两位溢出,符号位0补溢出的高位。0000 0000,结果为0。
b := 1 << 2 // 0000 0001 左移两位,符号位0不变,低位补0 。 0000 0100,结果为4。

移位运算示例:

package main
import "fmt"
func main() {
 var a int = 1 >> 2
 var b int = -1 >> 2
 var c int = 1 << 2
 var d int = -1 << 2
 fmt.Println("a=", a) // a= 0
 fmt.Println("b=", b) // b= -1
 fmt.Println("c=", c) // c= 4
 fmt.Println("d=", d) // d= -4
}

基本位运算示例:

package main
import "fmt"
func main() {
 fmt.Println("a=", 2&3) // a= 2
 fmt.Println("b=", 2|3) // b= 3
 fmt.Println("c=", 5|4) // c= 5
 fmt.Println("d=", -3^3) // d= -2
}

相关推荐

微信扫一扫,分享到朋友圈

【Go 基础】进制转换与位运算
返回顶部

显示

忘记密码?

显示

显示

获取验证码

Close