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语言中处理二进制数字的完整方案,包括转换、运算和格式化输出。

回到顶部