問題は、そのようなものである 「1」のバイナリ表現に必要な数であるバイト(8ビット)の符号なし整数変数について
21以上のほかに
8ビット整数、最後のものを除いて、他は2の整数乗です。場合1以上を金型2の後、最後の一つは1に結合され、1の数が、それ以外の場合は0で終わります。全体の数が0になるまで** / ** 2、下降後、高は、次のものを確認するために、低いものに低下します。
public int count1(int n) {
int num = 0;
while (n > 0) {
if (n % 2 == 1)//模1相加
num++;
n /= 2;
}
return num;
}
そして、操作
同じことが、それぞれ1かどうかを確認するために、最後の1です。整数演算は00000001で実行(&)の最後のビットが1である場合、1で結果の端部は、1の数NUM + 1の全体のおかげで、結果が7の前に0になり、0である最初の7ビットであるため、 、0答えと端が0、NUM + 0です。このとき、最後の不要なテストは、プロセスがゼロになるまで繰り返され、正しいものを完了しています。
public int count2(int n) {
int num = 0;
while (n > 0) {
num += (n&1);//讲位运算的结果加上 1 or 0
n = n >> 1;
}
return num;
}
効率的なビット操作
私たちは、最初の2つの操作は、無用0に多くの時間を無駄にするよう10000000など、いくつかの数、のために、アルゴリズムの複雑さは、それだけの数「1」を作ることができることがわかりましたか?N及びN-1&AND演算、最後の一つは即座に開始されてから、最も近い「1」と判断できるので、数は、その結果をnに割り当てられます。だから、一つ一つ、最後の1を判断してはいけません。
この操作かつてはそれぞれ、そのnがあることを意味し、「1。」
nは、1つの動作を満たすために最新の「1」ボローからでなければならないので、それ以外のことで-1数が0未満です。0 -1後、それ自体変化しない先行ビットによって、裏面全体0から1に変更されなければなりません。
割付操作は、その後に行われると、最初のものはNUM + 1、消去することができます。nが0に等しくなるまで処理を繰り返した後。
public static int count3(int n) {
int num = 0;
while (n > 0) {
n = n & (n - 1);
num++;
}
return num;
}
暴力と法律のいくつかの枝のための方法は、ルックアップテーブルは、これは、それらをリストしていない、すべての状況に事前に書き出されます。
あなたにこれが役に立つ場合は、下記をクリックしてくださいトリプルキーありがとう