進数「1」


問題は、そのようなものである 「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;
    }

暴力と法律のいくつかの枝のための方法は、ルックアップテーブルは、これは、それらをリストしていない、すべての状況に事前に書き出されます。

あなたにこれが役に立つ場合は、下記をクリックしてくださいトリプルキーありがとう

ここに画像を挿入説明

公開された41元の記事 ウォン称賛94 ビュー9562

おすすめ

転載: blog.csdn.net/qq_41718454/article/details/104512008