これは昨日の面接中に私が遭遇した面接の質問です。
一見シンプルですが、細部では実現できません。
帰宅後、百度で検索したら答えが見つかりました。
以下の通りです:
//计算一个十进制数转换为二进制数中‘1’的个数 //例如十进制11 = 二进制1011,则结果是3个1 //解题思路:利用 n & (n - 1) 可以将最后一个1变0 //xxxx1000 & (xxxx1000 - 1) = xxxx1000 & xxxx0111 = xxxx0000 // 1011 & (1011 - 1) = 1011 & 1010 = 1010 //直到最后一个1被与为0,得出结果 function count1($n) { $r = 0; while ($n != 0) { $r++; $n &= ($n - 1); } return $r; } echo count1(11);
読んでみて、あまり分かりにくいと思います(ビット演算が苦手なので…)
考えた結果、次の解決策を思いつきました:
function count1($n) { $r = 0; while($n !=0) { if(($n%2) !=0 ) { $r++; } $n=$n/2; } return $r; } echo count1(8);
これでさらに分かりやすくなるはずです。
上記は、PHP の面接の質問 (10 進数を 2 進数に変換した後の「1」の数を計算する) を、関連する内容も含めて紹介しています。PHP チュートリアルに興味のある友人に役立つことを願っています。