0

これは私が現在取り組んでいる宿題の問題です。渡された32ビットintxを調べて、その値を2秒補数に格納するために必要な最小ビットを返す必要があります。

例えば:

howManyBits(0) = 1;
howManyBits(-1) = 1;
howManyBits(7) = 4;
howManyBits(-10) = 5;

問題は、これを見つけるためにビット演算子しか使用できないこと、1バイトを超える定数を使用できないこと、および合計で90を超える操作を使用できないことです。現時点では、最上位ビットから1をビットスミアすることができます。その後、その中で1ごとにカウントします。ただし、これは32ビットintであり、ビットがオンになっていることを確認するたびにintを1から右にシフトする必要があるため、ビットをカウントアップするプロセスは、それ自体で90回の操作を必要とします。ビットスミアリングには20がかかりましたが、最大操作をはるかに超えています。

また、私は自分のソリューションで条件文やループを使用することを声に出して言っていません。

私はそれを解決できるlog_2アルゴリズムを理解できれば知っていますが、ビット演算子だけでもそれを理解することはできませんでした。

私が欲しいのは、実際のコードソリューションではなく、より少ない操作でそれを行うプロセスのヒント/説明です。ありがとう!

4

3 に答える 3

1

32ビット数のlog_2は、7回の操作で見つけることができます。優れたビットツイッドリングハックを見る

于 2013-02-03T20:26:05.540 に答える
0

ヒューストン - 問題があります。

すなわち

howManyBits(0) = howManyBits(-1) = 1;

したがって、ゼロには少なくとも 2 ビットが必要です。(または -1)

于 2013-02-03T19:41:32.977 に答える
0

これは宿題なので、直接的な回答はしたくありませんが、log2 のアイデアは正しい方向に進んでいます。

3つの操作の組み合わせで(正の数の場合)それをやってのけることができます

 1) Shift right 1
 2) Test for 0
 3) Add 1 to a number

それがあなたをそこに連れて行くのに十分であることを願っています。ソース番号は 2 の補数になるため、上記を有効にするには、最初にそれを正の数に変換する必要があります。

于 2013-02-03T19:49:16.220 に答える