您好,登錄后才能下訂單哦!
今天就跟大家聊聊有關(guān)使用php怎么統(tǒng)計(jì)二進(jìn)制中1的個(gè)數(shù),可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。
問題
輸入一個(gè)十進(jìn)制整數(shù),輸出該數(shù)二進(jìn)制表示中1的個(gè)數(shù)。其中負(fù)數(shù)用補(bǔ)碼表示。
解決思路
這是個(gè)位運(yùn)算的題目。
解法一:可以通過按位與操作,通過將每一位和1與操作來求出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,也就是通過這個(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; }
//測試 $num=45; echo $num."的二進(jìn)制是".decbin($num)."<br/>"; echo $num."共有".NumberOf1($num)."個(gè)1";
運(yùn)行結(jié)果:
看完上述內(nèi)容,你們對使用php怎么統(tǒng)計(jì)二進(jìn)制中1的個(gè)數(shù)有進(jìn)一步的了解嗎?如果還想了解更多知識(shí)或者相關(guān)內(nèi)容,請關(guān)注億速云行業(yè)資訊頻道,感謝大家的支持。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。