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

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

算法 - 二进制和十进制转换的相关文章

js二进制和十进制转换代码

js二进制和十进制转换代码:十进制和二进制的转换是在编码中是时常用到的,下面就是一段这样的代码实例,希望能够给需要的朋友带来帮助.代码实例如下: <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <meta name="author" conte

继续学习----二进制与十进制转换

二进制与十进制转换 本人有个更直接的方法,例如二进制数1000110转成十进制数可以看作这样: 数字中共有三个1 即第二位一个,第三位一个,第七位一个,然后十进制数即2的2-1次方+2的3-1次方+2的7-1次方即2+4+64=70 次方数即1的位数减一.如此计算只需要牢记2的前十次方即可在此本人为大家陈述一下:2的0次方是1 2的1次方是2 2的2次方是4 2的3次方是8 2的4次方是16 2的5次方是32 2的6次方是64 2的7次方是128 2的8次方是256 2的9次方是512 2的10

进制转换之二进制与十进制转换

一.正整数的十进制转换二进制: 要点:除二取余,倒序排列 解释:将一个十进制数除以二,得到的商再除以二,依此类推直到商等 于一或零时为止,倒取将除得的余数,即换算为二进制数的结果 例如把52换算成二进制数,计算结果如图: 52除以2得到的余数依次为:0.0.1.0.1.1,倒序排列,所以52对应的二进制数就是110100. 由于计算机内部表示数的字节单位都是定长的,以2的幂次展开,或者8位,或者16位,或者32位..... 于是,一个二进制数用计算机表示时,位数不足2的幂次时,高位上要补足若干个

二进制和十进制转换

注:八进制.十六进制和二进制同理,只不过将2换成8或16 二进制转换 正整数转成二进制:除二取余,直到商为零,然后倒序排列,高位补零. 例:42的二进制为:00101010 小数转换为二进制:乘二取整,直到小数部分为零,然后正序排列,即为二进制小数部分. 例:0.125的二进制为0.001 二进制转为十进制:相乘相加 整数部分 小数部分

二进制与十进制转换问题

进制转换问题实为最基础也实用的一种基本技能.首先得说,进制转换很简单,但就是时间长不用依赖计算器就容易忘,毕竟这不像其他的能在日常生活就经常用的的数学. 那么就聊聊十进制与二进制的转化,十进制转化为二进制,两种方法:短除法,数轴法.先说短除法,用10进制数除以2,得到的余数按倒叙排列,把52化成2进制就像这样,得到的结果为110100 再说数轴法,所谓的数轴法就是在数轴上从右到左分别标记2^0到2^n比如2^0等于1,2^1等于2,2^2等于4,一直下去,然后观察10进制数由几个这样的数组成,拿

二进制 八进制 十进制 十六进制之间的转换

一. 十进制与二进制之间的转换 (1)十进制转换为二进制,分为整数部分和小数部分 ① 整数部分 方法:除2取余法,即每次将整数部分除以2,余数为该位权上的数,而商继续除以2,余数又为上一个位权上的数,这个步骤一直持续下去,直到商为0为止,最后读数时候,从最后一个余数读起,一直到最前面的一个余数.下面举例: 例:将十进制的168转换为二进制 得出结果 将十进制的168转换为二进制,(10101000)2 分析:第一步:将168除以2,商84,余数为0.  第二步:将商84除以2,商42余数为0. 

二进制 八进制 十进制 十六进制

一. 十进制与二进制之间的转换 (1) 十进制转换为二进制,分为整数部分和小数部分 ① 整数部分 方法:除2取余法,即每次将整数部分除以2,余数为该位权上的数,而商继续除以2,余数又为上一个位权上的数,这个步骤一直持续下去,直到商为0为止,最后读数时候,从最后一个余数读起,一直到最前面的一个余数.下面举例: 例:将十进制的168转换为二进制 得出结果 将十进制的168转换为二进制,(10101000)2 分析:第一步,将168除以2,商84,余数为0. 第二步,将商84除以2,商42余数为0. 

Formiko总结整数十进制转换二进制原理

引子: 为什么十进制转二进制的“辗转相除记录余数倒序输出”的算法是正确的?这个问题陪伴了Formiko半年. 实践: 实践一:把十进制数100转换成二进制数的图   上图和和下图唯一的区别在最后一位上,只是除到0和除到1的区别,但在算法本身的理解上应该不会有本质的区别. 实践二: 十进制数100或许太大,不便于一目了然的验证.试一试十进制数1,2,3. 思考: 以上算法的思路是“对原数反复进行除法得到余数,最后将余数倒序输出”.但是看到如图对十进制数100,1,2,3的操作,都看不出原思路的由来

二进制与十进制之间的转换

我们从小学习使用的阿拉伯数字就是十进制的,这大概是因为我们有十根手指.十个脚趾,便于计数吧.而计算机和我们不同,它只有开和关这两种状态,也就是0和1,所以计算机使用二进制会更方便.在十进制里,每一位上的数值都和这个位上特定的量值相关联.比如123这个数,最低位的数值为3,它和这个位的量值即1(10º)相关联:十位数2和10(10¹)相关联:百位数1和100(10²)相关联,整个数的数值就等于(1 * 10² + 2 * 10¹ + 3 * 10º).同理,二进制的数值也是这样计算的,不过它每一位