标签:
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:])
}
标签:
原文地址:http://www.cnblogs.com/golove/p/5833375.html