これは、今年の会社の顔の質問です:
:一般的なアイデアはある進整数n個の文字列に変換し、そして数:
プライベート 静的 INT helper1(INT I){ charが [] CHS = Integer.toBinaryString(I).toCharArray(); int型のres = 0 ; 用(INT J = 0; J <chs.length; J ++ ){ 場合(CHS [J] == '1' ){ RES ++ 。 } } 戻りRES。 }
第二の方法は:整数n 1及びAN AND演算、最下位ビット整数nが1である場合、結果は、そうでなければ1、0です。次いで左に1 1が、そうでなければ結果は0であり、動作およびN、低倍が1である場合、結果がゼロでないと進みます。動作サイクル以上、非ゼロの数を記録することができます。
パブリック 静的 INT helper2(INT N){ int型のカウント= 0 ; int型フラグ= 1 。 一方、(フラグ<= N){ 場合(!(N&フラグ)= 0 ) カウント ++ 。 フラグ =フラグ<< 1 。 } を返す数えます。 }
第三の方法は:整数n 1及びAN AND演算、最下位ビット整数nが1である場合、結果は、そうでなければ1、0です。そして、nが右に1、操作および1を続行します。環状操作上、n = 0の数に記録ゼロ以外の(1)の終わりまで。
プライベート 静的 INT helper3(INT N){ int型のRES = 0 。 一方、(N!= 0 ){ もし、((N - 1)== 1 ){ RES ++ 。 } N = N >> 1 。 } 戻りRESと、 }
第四の方法は、次のとおり計算有する整数n及び(N-1) :整数が1だけデクリメントし、次いで0右端の整数となるであろう、元の整数演算で実行されます。そのような操作を行うことができる回数に1の数の整数のバイナリ表現。このような比較の数を減らすことができます。
プライベート 静的 INT helper4(INT N){ int型のRES = 0 。 一方、(N!= 0 ){ RES ++ 。 N = N・(N-1 )。 } 戻りRESと、 }
オーバー...
参考: