进制
在 Go 语言中,进制转换和表示是常见的操作,Go 支持常见的进制表示,包括二进制(binary)、八进制(octal)、十进制(decimal)和十六进制(hexadecimal)。每种进制都有特定的表示方法和用法。
1. 十进制(Decimal)
十进制是最常见的进制,也是默认的数值表示方式。它使用的是 0-9 的数字。
- 示例:
42(十进制)
go
package main
import "fmt"
func main() {
num := 42 // 十进制
fmt.Println(num) // 输出: 42
}2. 二进制(Binary)
二进制由 0 和 1 构成。在 Go 中,可以通过在数字前加上 0b 或 0B 来表示二进制数。
- 示例:
0b101010(二进制表示)
go
package main
import "fmt"
func main() {
num := 0b101010 // 二进制
fmt.Println(num) // 输出: 42
}3. 八进制(Octal)
八进制使用 0-7 的数字。在 Go 中,八进制数以 0 开头(不带其他前缀),并且仅支持非负数。
- 示例:
052(八进制)
go
package main
import "fmt"
func main() {
num := 052 // 八进制
fmt.Println(num) // 输出: 42
}4. 十六进制(Hexadecimal)
十六进制使用 0-9 和 A-F 的数字,其中 A-F 表示 10 到 15 的值。Go 中的十六进制数前缀为 0x 或 0X。
- 示例:
0x2A(十六进制表示)
go
package main
import "fmt"
func main() {
num := 0x2A // 十六进制
fmt.Println(num) // 输出: 42
}5. 进制转换
在 Go 中,除了直接表示不同进制数之外,常见的进制转换操作也可以使用内建函数来完成:
strconv.Itoa():将整数转换为字符串,结果是十进制表示。strconv.FormatInt():将整数转换为指定进制的字符串。strconv.ParseInt():将字符串解析为整数,并支持指定进制。
示例:进制转换
go
package main
import (
"fmt"
"strconv"
)
func main() {
// 十进制转为二进制、八进制、十六进制
num := 42
// 十进制转二进制
fmt.Println(strconv.FormatInt(int64(num), 2)) // 输出: 101010
// 十进制转八进制
fmt.Println(strconv.FormatInt(int64(num), 8)) // 输出: 52
// 十进制转十六进制
fmt.Println(strconv.FormatInt(int64(num), 16)) // 输出: 2a
// 字符串转整数
str := "2a"
hexNum, _ := strconv.ParseInt(str, 16, 0) // 解析十六进制字符串
fmt.Println(hexNum) // 输出: 42
}6. strconv 包
Go 的 strconv 包提供了一些非常有用的函数来处理数值与字符串之间的转换,包括不同进制的转换。
常用函数
strconv.Itoa():将整数转换为字符串,输出十进制表示。strconv.Atoi():将字符串解析为整数,输入为十进制字符串。strconv.FormatInt():将整数转换为指定进制的字符串。strconv.ParseInt():将字符串解析为整数,支持指定进制。
代码示例
go
package main
import (
"fmt"
"strconv"
)
func main() {
// 十进制转二进制、八进制、十六进制
num := 42
fmt.Println(strconv.FormatInt(int64(num), 2)) // 输出: 101010
fmt.Println(strconv.FormatInt(int64(num), 8)) // 输出: 52
fmt.Println(strconv.FormatInt(int64(num), 16)) // 输出: 2a
// 字符串转整数
str := "101010"
intVal, err := strconv.ParseInt(str, 2, 0) // 将二进制字符串转为整数
if err != nil {
fmt.Println("Error:", err)
}
fmt.Println(intVal) // 输出: 42
}7. 整数到浮点数的进制转换
对于浮点数,Go 也提供了进制转换,通常使用 strconv.FormatFloat() 来将浮点数转为字符串,或者使用 strconv.ParseFloat() 来将字符串解析为浮点数。
go
package main
import (
"fmt"
"strconv"
)
func main() {
// 将浮点数转换为十进制字符串
f := 42.42
str := strconv.FormatFloat(f, 'f', -1, 64)
fmt.Println(str) // 输出: 42.42
// 将字符串转换为浮点数
str = "42.42"
flo, err := strconv.ParseFloat(str, 64)
if err != nil {
fmt.Println("Error:", err)
}
fmt.Println(flo) // 输出: 42.42
}总结
Go 语言通过标准的进制表示和转换机制(如 0b、0x 前缀,strconv 包等)提供了强大的进制操作支持。了解和使用这些进制表示方法,有助于在处理数字时更加高效,特别是在进行低层次的计算、数据压缩、网络协议、硬件编程等场景中。