2016-07-18 5 views
0

私はわからないが!~&^|+<<>>はビット演算子を使ってforループの機能を複製

int loop(int x) { 
    for (int i = 1; i < 32; i += 2) 
    if ((x & (1 << i)) == 0) 
     return 0; 
    return 1; 
} 

イム含むだけビット単位や特定の演算子を使用して、ループの機能を再現しようとしていますこれらの演算子だけを使ってループの累積性質を再現する方法。私はシフトを理解しています<<>>は、私が乗算し、分割することができます。しかし、操作を使用して!&^~がより困難であることが証明されています。任意のヒント?

http://www.tutorialspoint.com/cprogramming/c_operators.htm

編集: Iは、ビットの添加は、このような出力は、最初しばらくを呼び出さずに、またはループのために達成することができない方法が、達成することができる方法を理解します。

+4

まず、関数が実際に何をしているのかを考える - あなたがどのようにしていることだろう、彼らはすべて1かどうかを確認するために、すべての奇数ビットをテストしていますビット演算子を使用して単一の操作で? (think masks) –

+0

@PaulR okだから、すべての偶数ビットが1に設定されたマスクを作成し、与えられた値と比較して、if((value&bit_mask)== 0)奇数0x55は私と比較する値を与えます。私は==しかし同様に使用しています。 – Silverfin

+3

これはリンクされた質問とどのように重複していますか? – Holt

答えて

4

多分これは助けることができる:

int loop(int x) { 
    x = x & 0xaaaaaaaa; // Set all even numbered bits in x to zero 
    x = x^0xaaaaaaaa; // If all odd numbered bits in x are 1, x becomes zero 
    x = !x;    // The operation returns 1 if x is zero - otherwise 0 
    return x; 
} 
+0

たぶん私はそれを取得しませんが、これは1より大きな値を返しますか? –

+0

ああ私は、参照してください!論理的ではない。賢い! –

0

コードはすべての奇数ビットをテストし、それらのビットがすべて設定されている場合は1を返します。このビットマスクを使用することができます:... 0101 0101 0101 32ビットは0xAAAAAAAAです。 次に、あなたはあなたの値とビットを取ります。結果がマスクと同じ場合は、すべてのビットが設定されていることを意味します。

int testOddBits(int x) { 
    return (x & 0xAAAAAAAA) == 0xAAAAAAAA; 
} 
+0

なぜ-1、私の答えは正しい! –

+1

@PaulRいいえ、戻り値はintであるため、ブールではありません。 –

+0

@PaulR私は試してはいけない、私はプログラミングを知っている。この関数は、0xAAAAAAAAの値である-1431655766を返します。あなたがboolと解釈するならば、0以外のすべての値が真であるため、それは真です。 –

関連する問題