1

このコードとの違いを説明したい

for(i = 32; i > 0; i--)
 {
   if(a&1 != 0) //bit mask
     total += b;
   a = a >> 1;
   b = b << 1; 
 }

コードでは、&はビットを「マスク」するために&&使用されており、代わりに使用された場合、結果は完全に異なります。その場合、式は、ビットの1つを保持するために使用される1ビット位置ではなく1、真理値()として解釈されていました。TRUE正しい?しかし、私がこのようにした場合、代わりに何が起こるでしょうか:

for(i = 32; i > 0; i--)
 {
   if(a|1 != 0) //bit mask
     total += b;
   a = a >> 1;
   b = b << 1; 
 }

最初のケースで1は、はLSB(最下位ビット)のみ、つまり右端のビットのみを保持するために使用されます。その代わりに何を|しますか?この変更を行った場合の違いは何ですか?

4

3 に答える 3

4
a&1 != 0

する必要があります

(a&1) != 0

!=より優先度が高い&。それ以外 a&1 != 0は と読みますa & (1 != 0)

についても同じです(a|1 != 0)

于 2012-08-27T15:41:47.233 に答える
1

この例では、中かっこを省略a&1しても、プログラムの意味は変わりません。

!=が優先されるため、どちらが評価され、1 != 0完全1!=0冗長なステートメントであるため、または と言うかは問題ではありませif (a OP (1 != 0))if ((a OP 1) != 0)

これで、2 番目のステートメントを見て、意図したとおりに解釈できます(a | 1) != 0。すべてのビットがゼロである唯一の値は0比較の右側にありますが、左側には常に少なくとも 1 つのビットが設定された値 (最も右側) があります。したがって、これらが実際に等しくなることはありません。したがって、(a | 1) != 0と同じ1です。

したがって、違いは、が奇数であるかどうかを(a & 1)実際にチェックし、その場合にのみインクリメントしますが、条件がトートロジーであるため、各反復でインクリメントします。atotal(a | 1)total

于 2012-08-27T16:03:08.660 に答える
1
(a | 1 ) != 0

常に真です。a を返す効果がありますが、明らかに 0 ではない最下位ビットが設定されています (少なくとも、これまでに見た C 実装ではそうではありません)。同様に

(a || 1)

C では 1 が true であり、何かまたは true が true であるため、常に true です。

于 2012-08-27T15:49:31.140 に答える