
本文介绍使用 go 标准库 `math/big` 对任意长度的二进制字符串(如超过 100 位)执行按位 or 运算的高效方法,避免逐字符遍历或 `strconv.parseint` 的 64 位限制。
在 Go 中处理超长二进制字符串(例如数百甚至上千位)的按位运算时,传统方式(如遍历每个字符做逻辑判断)不仅代码冗长、易出错,且时间复杂度为 O(n),性能较差;而 strconv.ParseInt(s, 2, 64) 又受限于 64 位整数范围,无法解析更长的二进制串。此时,math/big 包是标准、可靠且高效的解决方案——它提供了任意精度的整数支持,并原生封装了按位操作(如 Or, And, Xor 等),底层基于字节数组优化,时间复杂度接近线性,且内存占用可控。
以下是一个完整、可复用的示例:
package main
import (
"fmt"
"math/big"
)
// BinaryOR 对两个二进制字符串执行按位 OR,返回结果字符串(无前导零)
func BinaryOR(a, b string) string {
var bigA, bigB, result big.Int
// 将字符串解析为大整数(基数为 2)
if _, ok := bigA.SetString(a, 2); !ok {
panic("invalid binary string: " + a)
}
if _, ok := bigB.SetString(b, 2); !ok {
panic("invalid binary string: " + b)
}
// 执行按位 OR
result.Or(&bigA, &bigB)
// 转回二进制字符串(不含 "0b" 前缀)
return result.Text(2)
}
func main() {
fmt.Println(BinaryOR("11100", "00011")) // 输出: "11111"
fmt.Println(BinaryOR("101010101010", "010101010101")) // 输出: "111111111111"
fmt.Println(BinaryOR("1" + "00000000000000000000", "1")) // 支持超长串,如 21 位
}⚠️ 注意事项:
- big.Int.SetString(s, base) 要求输入字符串仅含有效数字字符(0/1 for base 2),不接受空格、前缀(如 "0b11100")或空字符串;建议调用前做基础校验。
- result.Text(2) 自动省略前导零,结果为最简二进制表示(如 OR("000", "001") → "1");若需固定长度输出(如补零至 128 位),可用 fmt.Sprintf("%0128s", ...) 配合字符串填充逻辑。
- math/big 操作虽高效,但仍涉及内存分配;对高频调用场景,可考虑复用 big.Int 实例(通过 .Set() 重置)以减少 GC 压力。
综上,math/big 是 Go 中处理任意长度二进制位运算的标准实践方案——兼具正确性、可读性与工程健壮性,推荐作为此类问题的首选解法。










