2012-04-23 13 views
3

私は少しいじる宿題の練習の最後の問題でトラブルを抱えています。任意の奇数ビットはここで1 に設定されている場合、関数は1を返すことになっていることは、私がこれまで持っているものです:完璧に動作しますが、私は(大のみ許可されていることの定数を使用することはできないのですCでのビット単位の操作 - AnyOddBit

int anyOddBit(int x) { 
    return (x & 0xaaaaaaaa) != 0; 
} 

0〜255,0xFF)。私はまた、使用することはできないのです=

具体的には、これは私が使用することに限定されていますものです:!

Each "Expr" is an expression using ONLY the following: 
    1. Integer constants 0 through 255 (0xFF), inclusive. You are 
     not allowed to use big constants such as 0xffffffff. 
    2. Function arguments and local variables (no global variables). 
    3. Unary integer operations ! ~ 
    4. Binary integer operations &^| + << >> 

を私はそれらの制限内の中にこれを行う方法を見つけ出すことはできませんし、私が本当にしたいです誰かが私を正しい方向に向けることができれば感謝します。前もって感謝します!あなたが先に論理積のあなたの論理和を行うことができ

+0

それでは、どの値(S)より小さい比較を作るには? –

答えて

3

あなたは使用することができます。

!!(( (x  & 0xff) 
    | ((x >> 8) & 0xff) 
    | ((x >> 16) & 0xff) 
    | ((x >> 24) & 0xff) 
) & 0xaa) 

「内側」ビットを、その論理和一緒に各ソースオクテットを、あなたに同等のビットがソースオクテットのいずれかに設定されている場合、各ビットが設定されているオクテットを与えます。したがって、奇数ビットの1つがソースオクテットに設定されている場合、それもターゲットオクテットに設定されます。

次に、単に0xaaとANDをとることによって、奇数ビットが設定されていない場合はゼロの値が、奇数ビットの場合はゼロ以外の値が設定されます。

次に、0または1が必要で、!=を使用できないため、2つの論理演算子でない!!と同様の効果が得られます。 !(any-non-zero-value)0を与え、!01を与えるので、それは動作します。


それは実際には必要ありませんので、のみ(むしろ上記の私の元の溶液につきなど13以上)12事業者とそれを行うためには、あなたが>> 24値を& 0xffを削除することができますが(ゼロ・ビットがからシフトしています左):

!!(( (x  & 0xff) 
    | ((x >> 8) & 0xff) 
    | ((x >> 16) & 0xff) 
    | ((x >> 24)  ) 
) & 0xaa) 

実際、あなたはそれよりも優れています。 (それはまた、同様に1行に収まる)は& 0xffセクションは必要ありませんので、最終& 0xaaは、とにかくすべての上位24ビットをクリアします:9人のオペレータにそれを降り

!!((x | (x >> 8) | (x >> 16) | (x >> 24)) & 0xaa) 

を。

+0

さて、それは今意味があります!ありがとう!オペレータ数を1つ減らす方法を知る必要があります。どうやら私は12の演算子しか使えず、これには13があります。 –

+0

@Cory、ゲーム開始後にルールを公平に変更していません:-)しかし、 '> 24'の値に対して'&0xff'を取り除くことができます実際には必要ありません。 – paxdiablo

+0

ああ、ありがとう! –

4

((x>>0) | (x>>8) | (x>>16) | (x>>24)) & 0xaa 

を初期シフト(x >> 0)はアウトに最適化されます - それは、一貫性のある外観のためにあります。

+0

私が使用することを許可されていないよ||演算子、論理演算子または論理演算子のみ。 –

+0

@Coryは、論理的または論理的です。使用が許可されているのは_bitwise_または '|'です。 – paxdiablo

+0

私は、そのことについて申し訳ありませんmisspoke。私は、論理的ではなく、ビット単位での使用を許可されています。 –

1

0xaaaaaaaaは基本的に(0xaa << 24) | (0xaa << 16) | (0xaa << 8) | (0xaa)であり、そのが許可され、そうではありませんか?

関連する問題