博客
关于我
php 实现进制转换(二进制、八进制、十六进制)互相转换
阅读量:793 次
发布时间:2023-02-28

本文共 3536 字,大约阅读时间需要 11 分钟。

进制转换是计算机领域中的一个基础知识点,涉及将数据从一种进制转换为另一种进制。十进制与其他进制(如二进制、八进制、十六进制)之间的转换是最常见的需求之一。下面将详细介绍十进制到其他进制的转换方法,以及如何将其他进制转换回十进制。

十进制转换为二进制、八进制、十六进制

将十进制数转换为其他进制,可以使用以下基本方法:

  • 不断除以目标进制数:将十进制数除以目标进制(如2、8、16),并记录余数。
  • 读取余数并连接:转换后的数值即为目标进制的各位数字,读取余数的顺序即为最终结果。
  • 不足位数补零:如果转换结果的位数少于目标进制所需的字节数,需在前面补零以确保位数完整。
  • 代码示例

    /** * 十进制转二进制、八进制、十六进制 * 不足位数前面补零 *  * @param array $datalist 传入数据 array(100,123,130) * @param int $bin 转换的进制可以是:2,8,16 * @return array 返回数据 */function dec_to_bin($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;    }    $bytelen = ceil(16 / $bin);    $aOutChar = array();    foreach ($datalist as $num) {        $t = "";        $num = intval($num);        if ($num === 0) {            continue;        }        while ($num > 0) {            $t .= $arr[$num % $bin];            $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;        }        $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));

    测试结果

    • 十进制到二进制:
      array(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 = 8 + 4 + 0 + 1 = 13
  • 逐位处理:将每一位的数字值乘以对应的权值(如二进制中的权值为 2^n,八进制为 8^n,十六进制为 16^n)。
  • 代码示例

    /** * 二进制、八进制、十六进制转十进制 *  * @param array $datalist 传入数据 array('ff','ff33','cc33') * @param int $bin 转换的进制可以是:2,8,16 * @return array 返回数据 */function bin_to_dec($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;    }    $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 += $arr[$tv] * pow($bin, $atlen - $i);                $i++;            }        }        $aOutData[] = $total;    }    return $aOutData;}// 测试用例var_dump(bin_to_dec(array('ff','ff33','cc33'), 16));  var_dump(bin_to_dec(array('1101101','111101101'), 2));  var_dump(bin_to_dec(array('1234123','12341'), 8));

    测试结果

    • 十进制数:
      array(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内置的函数如 bindec(), decoct(), dechex() 等。这些函数可以直接完成进制转换任务,简化了代码编写过程。

    转载地址:http://kwtfk.baihongyu.com/

    你可能感兴趣的文章
    php odbc驱动,php常用ODBC函数集(详细)
    查看>>
    php openssl aes ecb,php openssl_encrypt AES-128-ECB iOS
    查看>>
    php paypal rest api,PayPal REST API指定网络配置文件PHP
    查看>>
    php pcntl 多进程学习
    查看>>
    PHP pcntl_fork不能在web服务器中使用的变通方法
    查看>>
    php private ,public protected三者的区别
    查看>>
    php PSR规范
    查看>>
    php rand() 重复,array_rand()函数从另外一个数组中随机取得的一定数量的数组的元素是否会重复?...
    查看>>
    php redis pub/sub(Publish/Subscribe,发布/订阅的信息系统)之基本使用
    查看>>
    php redis 集群扩展类文件
    查看>>
    php redis(2)
    查看>>
    PHP Redis分布式锁
    查看>>
    php redis的应用
    查看>>
    php rss,如何用PHP编写RSS
    查看>>
    php session超时时间_php怎么设置session超时时间
    查看>>
    PHP SOAP模块的使用方法:NON-WSDL模式
    查看>>
    PHP Socket实现websocket(三)Stream函数
    查看>>
    php Socket通信
    查看>>
    PHP SPL标准库-迭代器
    查看>>
    php static 变量
    查看>>