LOTUS 發問時間: 電腦與網際網路程式設計 · 1 0 年前

php 如何十進位轉二進位

各位先進大家好:

以下是小弟今天練習的寫法

<html>

<body>

<form action = "test.php" method = "post">

<input type = "text" name = "a" size = "2">

<input type = "submit" value = "進行轉換">

<hr>

<?php

$a = $_post["a"];

$b = 2;

$c = $a/$b; //$c = 商數

$d = $a%$b; //$d = 餘數

$e = array(); //$e = 空白陣列

while ($c >= 1)

{

$c = $a/$b;

$d = $a%$b;

$a = $c;

array_push ($e,$d); //將數據丟入陣列

}

$f = array_reverse($e); //反轉陣列

$g = implode($f); //陣列組合成數字

echo $g;

?>

</body>

</html>

我希望最終結果可以以1~255的十進位轉換成8位數的二進位

在不足8位數的情況下能夠自動補齊

如 "12" → "00001100"

以下是小弟目前遇到的幾個問題想請前輩指點迷津一番:

1.文字鍵入區塊鍵入數值後無法作動

2.直接給$a定義一個數字的話,在定義成1的時候無法正常顯示

3.補齊8位數的方式一直沒有頭緒

4.我一直覺得我這個寫法似乎有點繞道? 有前輩有更加的方法嗎?

p.s. 以上皆在不使用decbin 情況下思考

在此先行感恩 : )

已更新項目:

剛剛研究了一下 php官方網站上sprintf的範例

還是有點不太清楚他的功用是幹麻用的

目前我只能大略了解它可以達到添加正負號、轉16、8、2進位的運算

但後來第六個範例我看不是很懂

為何在 "%" 與 "s" 中間加上數字、正負號、. 就會有所變化?

為何%10.10s 表示 left-justification but with a cutoff of 10 characters...?

對不起 問題很多 -.-"

感激不盡

2 個已更新項目:

謝謝火燒湯湯前輩的建議與勇仔前輩的解答

小弟還是在絞盡腦汁的情況下順利完成這個邏輯訓練了...

但還是希望兩位可以回答上面補充的疑問

以及..

為何我再while($c >= 1)的寫法會有錯誤?

而是要while($a >= 1)來完成?

$c是指商數被除到>=1跳出迴圈,這樣的講法不是也對嗎 : 0

感激不盡

3 個已更新項目:

補上我完成後的寫法... 分幾次貼 知識+不給一次貼上 -.-

4 個已更新項目:

看來不能正常顯示 -.- 我貼到意見那邊好了..

5 個已更新項目:

東陵少主前輩您好

小弟主要目的是想訓練自己邏輯的概念

所以才會使用這種笨拙的方式

明天要練習sql資料庫擷取的方式,有問題我會再上來向各位前輩討教噢!

再次感謝幾位前輩的不吝賜教

感激不盡 : D

5 個解答

評分
  • 1 0 年前
    最佳解答

    幫你改好了,程式碼如下,其中$_POST[]必須大寫,因為這是php內建的變數,不能善自改為小寫,小寫會被視為一般變數,也是導致你沒辦法作動的原因

    關於補齊零 printf("%08d", $g) ,這樣寫就可以了

    <html>

    <body>

    <form action = "test.php" method = "post">

    <input type = "text" name = "a" size = "2">

    <input type = "submit" value = "進行轉換">

    <hr>

    <?php

    $a = $_POST["a"];

    $b = 2;

    $c = $a/$b; //$c = 商數

    $d = $a%$b; //$d = 餘數

    $e = array(); //$e = 空白陣列

    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); }

    ?>

    </body>

    </html>

    參考資料:
  • YOGO
    Lv 5
    1 0 年前

    不用那麼麻煩吧!!為什麼不用php內建decbin函式轉換就好了ㄚ,若你想要不足8位數的情況下,能夠自動補齊,就用decbin+str_pad就可以了吧,參考一下吧!!

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

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

    <?php

    echo str_pad(decbin(12) , 8,"0",STR_PAD_LEFT)."\n";

    echo str_pad(decbin(26) , 8,"0",STR_PAD_LEFT);

    ?>

    為什麼一定要用陣列跑呢?用內建函數的效率會好很多吧

    歡迎光臨YOGO生活誌 http://blog.yogo.tw

    參考資料: 自己
  • 1 0 年前

    php 有內置轉制函數,不用自己運算

    $a = 12;

    $a = base_convert($a, 10, 2);

    printf("%08d", $a);

    2009-07-30 18:44:58 補充:

    不用內置函數也不難。

    不用設array,每擷一字直接併入變數 $out 就可。

    下面的程式可以將數字轉為2,3,4,5,6,7,8,9制,只須更改$b定義。

    <?php

    $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 。

  • 1 0 年前

    好,我會再看正解前先try一次

    謝謝火燒湯湯前輩的建議,多想才能貫通,如此才是學習之道

    2009-07-30 02:27:22 補充:

    2009-07-30 02:27:32 補充:

    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;

    ?>

  • 您覺得這個回答如何?您可以登入為回答投票。
  • 1 0 年前

    你先想想看,這題沒有很難

    1.form 寫錯了

    2.while (0 >= 1)

    3.string{} or sprintf

    4.嗯

    2009-07-30 02:36:24 補充:

    程式用 recursive function 來寫會很短

    http://program-lover.blogspot.com/2008/11/recursiv...

    2009-07-30 10:33:36 補充:

    //rescursive

    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"])):"";

    2009-07-30 10:35:38 補充:

    一直說我超過字數,真是怪事,上面是在用 遞迴 function 的寫法

    參考看看,當然用PHP內建的會更快

還有問題?馬上發問,尋求解答。