Golang中如何操作二进制数字?
Golang中如何操作二进制数字? 如何在Go语言中处理和进行数学运算,例如对两个二进制数进行加法或除法?
在Python中,有类似这样的方法:
bin(int('101101111', 2) + int('111111', 2))
除非你需要使用浮点数,否则这种方法工作得很好。
3 回复
如果在“开发时”已知它们,请使用带 0b 前缀的数字常量,如以下示例所示:
https://play.golang.org/p/X9iVtsZruuF
此外,还有 strconv 包,它提供了以任意你喜欢的进制解析字符串的功能。
更多关于Golang中如何操作二进制数字?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
非常感谢,基于您的回答,我总结出以下理解:
使用 0b 来定义二进制数,并使用 #b 来打印它,如下所示:
package main
import (
"fmt"
)
func main() {
fmt.Println("Hello, playground")
x := 0b101101111
y := 0b111111
fmt.Printf("\nx + y = %#b that is %v + %v = %v ", x+y, x, y, x+y)
a := 0b1000000001
b := 0b111111111
fmt.Printf("\na - b = %#b that is %v - %v = %v ", a-b, a, b, a-b)
c := 0b1000000001
d := 0b111111111
fmt.Printf("\nc * d = %#b that is %v * %v = %v ", c*d, c, d, c*d)
h := 0b10110101101
r := 0b101
fmt.Printf("\nh / r = %#b that is %v / %v = %v ", h/r, h, r, h/r)
fmt.Printf("\nh %% r = %#b that is %v %% %v = %v ", h%r, h, r, h%r)
}
请注意最后一行中的双 % 符号,我们使用 %% 来转义 %。
输出是:
x + y = 0b110101110 that is 367 + 63 = 430
a - b = 0b10 that is 513 - 511 = 2
c * d = 0b111111111111111111 that is 513 * 511 = 262143
h / r = 0b100100010 that is 1453 / 5 = 290
h % r = 0b11 that is 1453 % 5 = 3
同样适用于十六进制和八进制数,使用 0o 来定义八进制数并使用 #o 打印它,使用 0x 来定义十六进制数并使用 #x 打印它,下面是一个例子:
package main
import (
"fmt"
)
func main() {
fmt.Println("Hello, playground")
x := 1234
fmt.Printf("\nNumber %v =>\n In the binary system is: %#b \n In the hexgonal system is: %#x \n In the octal system is: %#o ", x, x, x, x)
O := 0o2322
fmt.Printf("\n%#o is %v ", O, O)
H := 0x4d2
fmt.Printf("\n%#x is %v ", H, H)
B := 0b10011010010
fmt.Printf("\n%#b is %v ", B, B)
}
输出是:
Hello, playground
Number 1234 =>
In the binary system is: 0b10011010010
In the hexgonal system is: 0x4d2
In the octal system is: 02322
02322 is 1234
0x4d2 is 1234
0b10011010010 is 1234
在Go语言中,可以通过标准库的strconv包和位操作来处理二进制数字。以下是具体实现:
1. 二进制字符串转整数
package main
import (
"fmt"
"strconv"
)
func main() {
// 二进制字符串转整数
num1, _ := strconv.ParseInt("101101111", 2, 64)
num2, _ := strconv.ParseInt("111111", 2, 64)
fmt.Printf("num1: %d\n", num1) // 输出: 367
fmt.Printf("num2: %d\n", num2) // 输出: 63
}
2. 二进制数的数学运算
package main
import (
"fmt"
"strconv"
)
func main() {
// 解析二进制字符串
a, _ := strconv.ParseInt("101101111", 2, 64) // 367
b, _ := strconv.ParseInt("111111", 2, 64) // 63
// 加法
sum := a + b
fmt.Printf("加法结果: %d (二进制: %b)\n", sum, sum)
// 输出: 加法结果: 430 (二进制: 110101110)
// 除法
quotient := a / b
remainder := a % b
fmt.Printf("除法结果: 商=%d (二进制: %b), 余数=%d (二进制: %b)\n",
quotient, quotient, remainder, remainder)
// 输出: 除法结果: 商=5 (二进制: 101), 余数=52 (二进制: 110100)
// 乘法
product := a * b
fmt.Printf("乘法结果: %d (二进制: %b)\n", product, product)
// 减法
difference := a - b
fmt.Printf("减法结果: %d (二进制: %b)\n", difference, difference)
}
3. 整数转二进制字符串
package main
import (
"fmt"
"strconv"
)
func main() {
num := 430
// 方法1: 使用FormatInt
binaryStr := strconv.FormatInt(int64(num), 2)
fmt.Printf("二进制字符串: %s\n", binaryStr) // 输出: 110101110
// 方法2: 使用fmt.Printf的%b格式化
fmt.Printf("二进制格式: %b\n", num) // 输出: 110101110
// 方法3: 带前缀的二进制表示
binaryWithPrefix := fmt.Sprintf("0b%b", num)
fmt.Printf("带前缀二进制: %s\n", binaryWithPrefix) // 输出: 0b110101110
}
4. 位运算操作
package main
import "fmt"
func main() {
x := 0b101101111 // Go 1.13+ 支持二进制字面量
y := 0b111111
// 位与
and := x & y
fmt.Printf("位与: %b & %b = %b\n", x, y, and)
// 位或
or := x | y
fmt.Printf("位或: %b | %b = %b\n", x, y, or)
// 异或
xor := x ^ y
fmt.Printf("异或: %b ^ %b = %b\n", x, y, xor)
// 左移
leftShift := x << 2
fmt.Printf("左移: %b << 2 = %b\n", x, leftShift)
// 右移
rightShift := x >> 2
fmt.Printf("右移: %b >> 2 = %b\n", x, rightShift)
}
5. 完整示例:二进制加法器
package main
import (
"fmt"
"strconv"
)
func binaryAdd(a, b string) string {
num1, _ := strconv.ParseInt(a, 2, 64)
num2, _ := strconv.ParseInt(b, 2, 64)
sum := num1 + num2
return strconv.FormatInt(sum, 2)
}
func binaryDivide(a, b string) (quotient, remainder string) {
num1, _ := strconv.ParseInt(a, 2, 64)
num2, _ := strconv.ParseInt(b, 2, 64)
q := num1 / num2
r := num1 % num2
return strconv.FormatInt(q, 2), strconv.FormatInt(r, 2)
}
func main() {
// 二进制加法
result := binaryAdd("101101111", "111111")
fmt.Printf("101101111 + 111111 = %s\n", result)
// 二进制除法
q, r := binaryDivide("101101111", "111111")
fmt.Printf("101101111 / 111111 = 商: %s, 余数: %s\n", q, r)
}
这些方法提供了在Go语言中处理二进制数字的完整方案,包括转换、运算和格式化输出。

