首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP 取任意進制指定位數:數學運算實作

     編輯:PHP 綜合知識

問題定義

給定十進位整數 $num、目標進制 $bin、位置 $pos(從右邊第 1 位開始),求該位置上的數值。

例:16 轉 9 進制為 17,第 1 位(個位)為 7。

遞迴實作

<?php
/**
 * 取得任意進制指定位數的值
 * @param int $num 十進位數值
 * @param int $bin 目標進制 (2-36)
 * @param int $pos 位置 (1=個位, 2=十位, ...)
 * @return int 該位數值
 */
function getRemainder(int $num, int $bin, int $pos): int {
    if ($bin < 2 || $bin > 36) throw new InvalidArgumentException('進制範圍 2-36');
    if ($pos < 1) throw new InvalidArgumentException('位置需 >= 1');
    
    $divisor = (int)pow($bin, $pos);       // 10^pos, 9^pos ...
    $base    = (int)pow($bin, $pos - 1);   // 10^(pos-1)
    
    // 遞迴縮減:若數值大於等於除數,取模後繼續
    if ($num >= $divisor) {
        $maxPow = (int)pow($bin, floor(log($num, $bin)));
        $num = $num % $maxPow;
        return getRemainder($num, $bin, $pos);
    }
    
    // 直接計算該位數值
    return (int)($num / $base);
}

// 測試
echo getRemainder(16, 9, 1); // 7
echo getRemainder(16, 9, 2); // 1
echo getRemainder(255, 16, 2); // F(15) 在 16 進制 FF 中十位為 F=15
?>

非遞迴優化版(效能更好)

<?php
function getDigitAtBase(int $num, int $base, int $pos): int {
    if ($base < 2) throw new InvalidArgumentException('Base must be >= 2');
    $pow = 1;
    for ($i = 1; $i < $pos; $i++) {
        $pow *= $base;
    }
    return (int)(($num / $pow) % $base);
}
// 等同:($num / $base**($pos-1)) % $base
?>

數學原理

第 $pos 位的權重為 $base^($pos-1)。整除該權重後取模 $base 即得該位數值:

digit = floor(num / base^(pos-1)) % base

應用場景

  • 進制轉換器(不產生完整字串,僅取特定位)
  • 分頁/分桶演算法(如一致性雜湊取特定位)
  • 位元操作模擬(Base 2 時相當於 bit 取值)
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved