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更有寫作的動力。



11 則留言:

pyfun 提到...

關於dw8用重複功能時遇到的問題!!!!
我想在一個限定的長度里顯資料.當向右放不夠時就往下一行放
我的情況是:上面放圖片,圖片正下方放對應的文字 (都從資料表里拿)
可是我只能做到,不是全部向右一直出,就是一個個的向下一直出.
要如何做才能解決??

還有一個 :亂數取出一筆資料,如果我要亂數取出數筆資料
是不是:
SELECT * FORM tbads ORDER BY RAND() LIMIT 5 <==改變這個數值??

YOGO 提到...

你第1個問題我不懂你說的意思,要麻煩你說清楚一點,才能幫你想辦法解決

關於你第2個問題,是的沒錯,若要改變取出數筆是要改變LIMIT 5數字的部份,若要變成取出10資料就要改成LIMIT 10

pyfun 提到...

dw8用重複功能時我有三個情況出現:
第一個:重複出現圖片==>那麼就會在不夠位時就自動跳下一行出.
第二,三是用表格兩列 : 上面放圖片,下方放對應的文字,然後用重複功能. 那就不能做到第一個情況的功能,因為只能一個個的"向下一直出" 或 "向右一直出,不會在不夠位時跳下一行". 這樣問懂嗎?

YOGO 提到...

老實說我看不太懂你的意思,不過大約猜了一下你的意思,你看看下面那2個連結的文章是否為你想想要的結果

強制HTML表格內文不超出設定寬度 (強制斷行)
http://www.neo.com.tw/archives/12


[CSS] float:left 排版亂象
http://www.neo.com.tw/archives/754

pyfun 提到...

這方法是用於文字的,我試過了,沒有效果
看來還是人手做吧!!謝謝你.

不過還有一個問題,用mysql把一大段文字抓出來,要怎樣限制出多少文字,而之後的文字用...表示

YOGO 提到...

老實說你第一個問題我真的是看不懂你的需求,所以我也幫不上忙,抱歉,關於第2個問題你參考一下這篇文章吧!!

http://blog.yogo.tw/2009/08/php_19.html

pyfun 提到...

謝謝...不過在文字最後一個會出亂碼,一個中文字,不過不是資料里有的.
但如果文字不超過限定的數值就沒有問題

YOGO 提到...

我有補充說明,你去http://blog.yogo.tw/2009/08/php_19.html看一下吧

pyfun 提到...

謝謝...我想是字碼的問題,我把utf8改成big5就沒事了.
另外我想到如何表達我的問題了
http://www.game388.com/Adventure/1/
就像以上的網站那樣,請你看看

YOGO 提到...

我大概知道你的意思了,要解決你的問題有2個方式,一個是用表格然後用"橫向重複區域"處理,可參考這篇文章(自製"橫向重複區域(超簡單)! http://www.flycan.com.tw/board/modules/newbb/viewtopic.php?topic_id=104&forum=8)或到http://www.tom-muck.com/extensions/help/HorizontalLooper/下載DW用的橫向重複區域外掛,另外一個方式就是用CSS來控制,也就是我之前有先給你的那個網址內容(http://www.neo.com.tw/archives/754)這2個方法都能達成你的需求

pyfun 提到...

謝謝你...終於可以解決這問題了

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

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