package main import "fmt" func main() { for i := 0; i <= 16; i++ { vB := Ito0B(0-i, 8) // int 转 bin 测试 vI := BtoI(vB) // bin 转 int 测试 fmt.Printf("%v, %2v\n", vB, vI) } } // bin 转 int func BtoI(s string) int { if len(s) > 0 && s[0] == ‘-‘ { return 0 - int(btoui64(s[1:])) } return int(btoui64(s)) } // bin 转 uint64 func btoui64(s string) uint64 { end := len(s) - 1 // 超出范围则返回 0 if end < 0 || end > 62 { return 0 } // 开始转换 var v uint64 for i := 0; i <= end; i++ { v <<= 1 if s[i] == ‘1‘ { v++ } } return v } // int 转 bin func ItoB(a int) string { if a < 0 { return "-" + ui64to0b(uint64(0-a), 0) } else { return ui64to0b(uint64(a), 0) } } // int 转 bin(添加前导0) // l 表示结果长度 func Ito0B(a int, l int) string { if a < 0 { return "-" + ui64to0b(uint64(0-a), l) } else { return ui64to0b(uint64(a), l) } } // uint64 转 bin,(添加前导0) // l 表示结果长度 func ui64to0b(a uint64, l int) string { // 开始转换 s := make([]byte, 64) i := len(s) - 1 for mask := uint64(1); i > 0; i-- { if mask > a { break } if a&mask == 0 { s[i] = ‘0‘ } else { s[i] = ‘1‘ } mask <<= 1 } // 处理值为 0 的情况 if i == len(s)-1 { s[i] = ‘0‘ i-- } // 添加前导 0 for ; i >= len(s)-l; i-- { s[i] = ‘0‘ } return string(s[i+1:]) }
时间: 2024-11-08 17:39:04