前些时候工作时候,需要用到进制转换,这个问题在刚刚接触计算机理论时候,还是很会的,好久不用,居然模糊了……
- 十进制转换为二进制、八进制、十六进制
1
从十进制向其它进制转换,用的是就用该数字不断除以要转换的进制数,读取余数。连接一起就可以了。
1
<strong></strong>
1
<strong>代码:</strong>
1
2
3
4
5
6
7
8
<?php
/**
*十进制转二进制、八进制、十六进制 不足位数前面补零*
*
* @param
array
$datalist
传入数据
array
(100,123,130)
* @param int
$bin
转换的进制可以是:2,8,16
* @
return
array
返回数据
array
() 返回没有数据转换的格式
* @Author chengmo QQ:8292669
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
* @copyright http:
//www.cnblogs.com/chengmo
*/
function
decto_bin(
$datalist
,
$bin
)
{
static
$arr
=
array
(0,1,2,3,4,5,6,7,8,9,
'A'
,
'B'
,
'C'
,
'D'
,
'E'
,
'F'
);
if
(!
is_array
(
$datalist
))
$datalist
=
array
(
$datalist
);
if
(
$bin
==10)
return
$datalist
;
//相同进制忽略
$bytelen
=
ceil
(16/
$bin
);
//获得如果是$bin进制,一个字节的长度
$aOutChar
=
array
();
foreach
(
$datalist
as
$num
)
{
$t
=
""
;
$num
=
intval
(
$num
);
if
(
$num
===0)
continue
;
while
(
$num
>0)
{
$t
=
$arr
[
$num
%
$bin
].
$t
;
$num
=
floor
(
$num
/
$bin
);
}
$tlen
=
strlen
(
$t
);
if
(
$tlen
%
$bytelen
!=0)
{
$pad_len
=
$bytelen
-
$tlen
%
$bytelen
;
$t
=
str_pad
(
""
,
$pad_len
,
"0"
,STR_PAD_LEFT).
$t
;
//不足一个字节长度,自动前面补充0
}
$aOutChar
[]=
$t
;
}
return
$aOutChar
;
}
测试:
var_dump(decto_bin(array(128,253),2));
var_dump(decto_bin(array(128,253),8));
var_dump(decto_bin(array(128,253),16));X-Powered-By: PHP/5.2.0
Content-type: text/htmlarray(2) {
[0]=>
string(8) "10000000"
[1]=>
string(8) "11111101"
}
array(2) {
[0]=>
string(4) "0200"
[1]=>
string(4) "0375"
}
array(2) {
[0]=>
string(2) "80"
[1]=>
string(2) "FD"
}
- 二进制、八进制、十六进制转十进制
这个转换用乘法,如:1101 转十进制:1*2^3+1*2^2+0*2^1+1*2^0
代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
<?php
/**
*二进制、八进制、十六进制 转十进制*
*
* @param array $datalist 传入数据array(df,ef)
* @param int $bin 转换的进制可以是:2,8,16
* @return array 返回数据 array() 返回没有数据转换的格式
* @copyright chengmo QQ:8292669
*/
function
bin_todec(
$datalist
,
$bin
)
{
static
$arr
=
array
(
'0'
=>0,
'1'
=>1,
'2'
=>2,
'3'
=>3,
'4'
=>4,
'5'
=>5,
'6'
=>6,
'7'
=>7,
'8'
=>8,
'9'
=>9,
'A'
=>10,
'B'
=>11,
'C'
=>12,
'D'
=>13,
'E'
=>14,
'F'
=>15);
if
(!
is_array
(
$datalist
))
$datalist
=
array
(
$datalist
);
if
(
$bin
==10)
return
$datalist
;
//为10进制不转换
$aOutData
=
array
();
//定义输出保存数组
foreach
(
$datalist
as
$num
)
{
$atnum
=
str_split
(
$num
);
//将字符串分割为单个字符数组
$atlen
=
count
(
$atnum
);
$total
=0;
$i
=1;
foreach
(
$atnum
as
$tv
)
{
$tv
=
strtoupper
(
$tv
);
if
(
array_key_exists
(
$tv
,
$arr
))
{
if
(
$arr
[
$tv
]==0)
continue
;
$total
=
$total
+
$arr
[
$tv
]*pow(
$bin
,
$atlen
-
$i
);
}
$i
++;
}
$aOutData
[]=
$total
;
}
return
$aOutData
;
}
测试:
var_dump(bin_todec(array('ff','ff33','cc33'),16));
var_dump(bin_todec(array('1101101','111101101'),2));
var_dump(bin_todec(array('1234123','12341'),8));X-Powered-By: PHP/5.2.0
Content-type: text/htmlarray(3) {
[0]=>
int(255)
[1]=>
int(65331)
[2]=>
int(52275)
}
array(2) {
[0]=>
int(124)
[1]=>
int(508)
}
array(2) {
[0]=>
int(342099)
[1]=>
int(5345)
}
后话,这些只是实现方式,其实不在乎php语言还是其它,实现思路都是一样的。php其实内置不少函数可以完成这些内容:
bindec(),decoct(),dechex() base_convert() decbin() 这里只是实现思路而已。