少し前の就職の面接中に、ビットベクトル構造 (符号なし整数や long など) の正の (つまり、「1」に設定された) ビットの数を計算するように求められました。私のソリューションは、C# ではかなり単純でした。
int CountBits(uint input)
{
int reply = 0;
uint dirac = 1;
while(input != 0)
{
if ((input & dirac) > 0) reply++;
input &= ~dirac;
dirac<<=1;
}
return reply;
}
次に、シフトを使用せずにタスクを解決するように求められました。明示的なもの (「<<」や ">>" など) も暗黙的なもの (2 を掛けるなど) もありません。2 の潜在的な行 (0、1、2、4、8、16 など) を使用した「ブルート フォース」ソリューションも機能しません。
誰かがそのようなアルゴリズムを知っていますか?
私が理解している限り、それは入力ビットベクトルのサイズに依存しない多かれ少なかれ一般的なアルゴリズムの一種であるべきです。他のすべてのビット演算と数学関数が許可されます。