なぜ私は、結果を合計する前に、左シフトする必要がありますか?

RagnarRock8:

ここで意図したとおりに動作するコードスニペットがあり、それは正しく整数のビットを反転させて、新しいintを返します。私の質問は、なぜ行がないているresult <<= 1私が運転して結果を合計する前に発生しなければなりませんかn&1

結果は私が入れた場合は0としてインスタンス化されるので、最初の反復では、それが結果に影響しないresult <<= 1forループの最後に行を、私はまだとIの加算結果の前に結果を左シフトされるだろうn&1私のコードは、最後に左シフトした結果と、動作していないと私は、この最後のステップを理解するように見えることはできません。

public int reverseBits(int n) {
    int result = 0;
    for(int i=0; i<32; i++){
        result <<= 1;
        result += n&1;
        n >>= 1;
    }
    return result;
}
Eraklon:

それは確かに効果はありませんが、大丈夫thatsの最初の反復では、thatsのは意図しました。これは、書き込みよりも、優れていますif (i != 0) result <<= 1;それはすべての反復でこれをチェックするのは非効率的だろう。しかし、また、重要なのは、本質的にのみ31で32反復のうち、それが効果を持つべきでありますようにこれを注意します。あなたが置くのであればresult <<= 1;メイクよりも、最後の行を確認してください、今だけ順序を変更するので、それは最初の反復で実行する必要がありますが、それは最後の繰り返しではないことを、31回も念頭に置いて効果的に実行されています。つまり、結果は無効になります理由です。

これを試して。これは動作します。

public int reverseBits(int n) {
    int result = 0;
    for(int i=0; i<32; i++){
        result += n&1;
        n >>= 1;
        if (i != 31) // skip the shift in last iteration
            result <<= 1;
    }
    return result;
}

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=4951&siteId=1