2009年7月31日

php 如何十進位轉二進位


今天在Yahoo知識+看到一則討論,是關於php如何十進位轉二進位的問題(http://tw.knowledge.yahoo.com/question/question?qid=1609073000065),在該討論中原提問者希望最終結果可以以1~255的十進位轉換成8位數的二進位,在不足8位數的情況下能夠自動補齊,如 "12" → "00001100"。

在原討論中原提問者希望能不用php內建函數來解決這個問題(真是奇怪的想法,有現成的含式不用,偏要重寫),所以得到各方高手以下的幾種寫法解答:


解法1:
while ($c >= 1){
$c = $a/$b;
$d = $a%$b;
$a = $c;
array_push ($e,$d); //將數據丟入陣列
}
$f = array_reverse($e); //反轉陣列
$g = implode($f); //陣列組合成數字
if ($_POST["a"]==1) {
printf("%08d", $_POST["a"]);
}else{
printf("%08d", $g);
}


解法2:
不用內置函數也不難,不用設array,每擷一字直接併入變數 $out 就可以,下面的程式可以將數字轉為2,3,4,5,6,7,8,9制,只須更改$b定義。

$a = 12;
$b = 2;
while ( $a>=$b ){
$out = $a%$b . $out;
$a = floor($a/$b);
}
$out = $a.$out;
$out = str_repeat("0",8-strlen($out)) .$out;print $out;

當 $a 為1,輸出 00000001 。


解法3:
while ($a >= 1){
$c = $a/$b;
$d = $a%$b;
$a = $c;
array_push ($e,$d);
}
$f = array_reverse($e);
$g = implode($f);
$z = sprintf('%08s' , $g);
echo $z;
?>


解法4:
php 有內置轉制函數,不用自己運算
$a = 12;
$a = base_convert($a, 10, 2);
printf("%08d", $a);


解法5:
function decToBinary($num, $str = "00000000", $pos = 0) {
if ($pos == 8) {
return $str;
} else {
$str{(7-$pos++)} = $num % 2;
return decToBinary(intval($num / 2), $str, $pos);
}
}
echo (isset($_POST["a"]))?decToBinary(intval($_POST["a"])):"";


以上是各方高手提供的解法,不過基本上YOGO比較傾向使用內建函式來處理,因為php是屬直譯程式,自己寫的處理函式會比php內建函式慢,且php已有內建程式可處理,就無需再重新造輪一次, 以下為YOGO的解法,給各位朋友參考看看:


十進制轉二進制(http://tw.php.net/manual/en/function.decbin.php)

以指定字元加字串填滿到指定長度(http://tw.php.net/manual/en/function.str-pad.php)


範例:
echo str_pad(decbin(12) , 8,"0",STR_PAD_LEFT)."\n";
echo str_pad(decbin(26) , 8,"0",STR_PAD_LEFT);


延伸閱讀:
PHP函數參考大全

如果覺得這篇文章對您有所幫助,在觀看完文章之餘,希望能點選下方方廣告,當作是對YOGO的支持,讓YOGO更有寫作的動力。



聖誕跑趴歡樂降★韓版假兩件針織連衣裙$890,新款顯瘦棒球服連帽風衣外套下殺$510,冬新款歐美棉襖棉服連帽短款外套限量↘$530,秋冬新款韓版大碼毛領氣質毛料外套↘$680,快上左耳貓網路購物

您好!如圖太小看不清楚,請 點選此處 看詳細內容 左耳貓蝦皮賣場 https://shopee.tw/hrf5168 左耳貓 露天賣場 http://class.ruten.com.tw/user/index00.php?s=starbox 左耳貓粉...