最新消息:yaf表单扩展中新增加了浮点数、日期和集合的校验。php yaf框架扩展实践三——表单

二进制,八进制,十进制和十六进制之间的转换原理和php的实现

编程开发 5403浏览 0评论

进制定义
二进制:逢二进一,借位为二的数字表示方式,只有0和1两个符号。
八进制:逢八进一,借位为八的数字表示方式,表示符号就是0-7。
十进制:逢十进一,借位为十的数字表示方式,表示符号就是0-9。
十六进制:逢十六进一,借位为十六的数字表示方式,表示符号就是0-9,A,B,C,D,E,F。
根据组合数学,4种进制的相互转换情况共有12种。

1、二进制,八进制,十六进制转换成十进制

这边有一个通用的公式:形如bnbn-1bn-2…b1的数字,利用公式bn*S^(n-1)+bn-1*S^(n-2)+….+b1*S^0来进行计算,其中n表示位数,S表示进制( 二进制,八进制,十六进制分别对应2,8,16)

二进制转换:1010001 => 1*2^6+1*2^4+1*2^0 => (十进制数)81
八进制转换:141 => 1*8^2+4*8^1+1*8^0 => (十进制数)97
十六进制转换:5d => 5*16^1 + d*16^0 => (十进制数)93

php中的实现代码:

echo bindec('1010001'); //输出81
echo octdec(141); //输出97
echo hexdec('5d');//输出93

2、十进制转换成二进制,八进制,十六进制

用十进制的数除以S 每除一下将余数就记在旁边,直到商为0,最后按余数从下向上排列就可得到。其中S表示进制( 二进制,八进制,十六进制分别对应2,8,16)

php中的对应实现代码:

echo decbin(81); //输出1010001
echo decoct(97); //输出141
echo dechex(93); //输出5d

3、二进制和八进制互相转换

二进制转换八进制
从最低位开始划分,每3个一组,最后一组如果不足3个,则在前面补0,然后将每组转成八进制码,就得到结果了。
1010001 => (分组)001 010 001 => (八进制数)121

八进制转换成二进制就上面的逆运算。

php中的对应实现代码:

echo base_convert('1010001', 2, 8); //输出121
echo base_convert('121', 8, 2); //输出1010001

4、二进制和十六进制互相转换

和二进制转换成八进制类似,只是每组个数为4
1011101 => (分组)0101 1101 => (十六进制数)5d

十六进制转换成二进制就上面的逆运算。

php中的对应实现代码:

echo base_convert('1011101', 2, 16); //输出5d
echo base_convert('5d', 16, 2); //输出1011101

5、八进制和十六进制互相转换

可以先转换成二进制,然后再转换成对应进制。

php中的对应实现代码:

echo base_convert('121', 8, 16); //输出51
echo base_convert('5d', 16, 8); //输出135

上面将12种情况都说明完了。感觉有点头晕,这么多方法,真难记,我推荐一个办法,就是不用记,需要用的时候再来查手册吧。如果非要记一下的话,可以记下各进制的英文单词,二进制(binary)、八进制(octal)、十进制(decimal)、十六进制(hexadecimal),php提供的方法就是英文单词的前3个字母凑在一起。如果没有的话,就使用base_convert方法吧,这个是一个通用的方法,不过可能会导致大数值中的精度丢失。

转载请注明:快乐编程 » 二进制,八进制,十进制和十六进制之间的转换原理和php的实现

发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址