RagnarRock8:
ここで意図したとおりに動作するコードスニペットがあり、それは正しく整数のビットを反転させて、新しいintを返します。私の質問は、なぜ行がないているresult <<= 1
私が運転して結果を合計する前に発生しなければなりませんかn&1
?
結果は私が入れた場合は0としてインスタンス化されるので、最初の反復では、それが結果に影響しないresult <<= 1
forループの最後に行を、私はまだと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;
}