码迷,mamicode.com
首页 > 编程语言 > 详细

算法 - 二进制和十进制转换

时间:2016-09-02 14:40:47      阅读:163      评论:0      收藏:0      [点我收藏+]

标签:

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!