php怎么實(shí)現(xiàn)統(tǒng)計(jì)二進(jìn)制中1的個(gè)數(shù)算法?本文為大家介紹了php實(shí)現(xiàn)統(tǒng)計(jì)二進(jìn)制中1的個(gè)數(shù)算法的實(shí)例代碼,快來(lái)看看吧。
問(wèn)題
輸入一個(gè)十進(jìn)制整數(shù),輸出該數(shù)二進(jìn)制表示中1的個(gè)數(shù)。其中負(fù)數(shù)用補(bǔ)碼表示。
解決思路
這是個(gè)位運(yùn)算的題目。
解法一:可以通過(guò)按位與操作,通過(guò)將每一位和1與操作來(lái)求出1的個(gè)數(shù)。
解法二(最優(yōu)解):一個(gè)巧妙的方法,一個(gè)不為0的二進(jìn)制數(shù),肯定至少有一位是1,當(dāng)這個(gè)數(shù)減一的時(shí)候,它的最后一位1會(huì)變?yōu)?,后邊的所有0會(huì)變?yōu)?。比如10100,減一之后會(huì)變?yōu)?0011,然后用原數(shù)字10100和10011進(jìn)行與操作之后,會(huì)得到10000,也就是通過(guò)這個(gè)操作,可以將一個(gè)1變?yōu)?,所以一個(gè)二進(jìn)制數(shù)字能進(jìn)行多少次這樣的操作,就有多少個(gè)1.
實(shí)現(xiàn)代碼
//解法一function NumberOf1($n){ $count = 0; $flag = 1; while ($flag != 0) { if (($n & $flag) != 0) { $count++; } $flag = $flag << 1; } return $count;}
// 解法二function NumberOf1($n){ $count = 0; if($n < 0){ // 處理負(fù)數(shù) $n = $n&0x7FFFFFFF; ++$count; } while($n != 0){ $count++; $n = $n & ($n-1); } return $count;}
//測(cè)試$num=45;echo $num."的二進(jìn)制是".decbin($num)."<br/>";echo $num."共有".NumberOf1($num)."個(gè)1";
相信看了本文案例你已經(jīng)掌握了方法,更多精彩請(qǐng)關(guān)注 其它相關(guān)文章!
推薦閱讀:
PHP的回調(diào)函數(shù)使用詳解
PHP中應(yīng)該怎么使用file_put_contents函數(shù)
以上就是php如何統(tǒng)計(jì)二進(jìn)制算法的詳細(xì)內(nèi)容,更多請(qǐng)關(guān)注 其它相關(guān)文章!
鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。
新聞熱點(diǎn)
疑難解答
圖片精選