어제 면접에서 만난 면접질문입니다.
얼핏 보면 단순해 보이지만, 세부적으로는 실현될 수 없습니다.
집에 와서 바이두에서 검색해서 답을 찾았어요.
은 다음과 같습니다.
//计算一个十进制数转换为二进制数中‘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 면접 질문('1'의 개수를 바이너리로 변환한 후 소수로 계산)을 소개하고 관련 내용을 포함하여 PHP 튜토리얼에 관심이 있는 친구들에게 도움이 되길 바랍니다.