2016-04-30 14 views
3

このコードをより効率的かつ/または短時間で書き換えて、バイトを節約し、あまり冗長ではないようにする方法?このコードスニペットを効率的に書く方法は?

if(N % 2 == 0 && (N == 6 || N == 8 || N == 10 || N == 12 || N == 14 || N== 16 || N == 18 || N == 20)) 
{ 
    printf("Weird\n"); 
} 

言語はCですが、javaやphpなどの言語であれば問題ありません.-)。

+2

N%2 == 0 && N> 5 && N <21'なぜでしょうか? – skypjack

答えて

5

Nは、符号なし整数型を持っていると仮定すると、あなたが明快でより興味を持って、最小限のソースコードです、あなたが書くかもしれません

if (((N - 6) & 14) + 6 == N) { 
    printf("Weird\n"); 
} 

説明

最初の操作N - 6は、許容値の範囲を6 - 20から0 - 14にシフトします。後者の範囲は4ビットで表すことができます。

第2の操作& 14は、ビットパターン1110を持つビット単位でです。これにより、偶数は0 - 14の範囲で変わりませんが、奇数を偶数に変換し、上位ビットをクリアします。変更されずに生存する唯一の値は、最初のステップで元の目標値から導き出された値です。

第3の操作は最初の操作を逆にして、結果を元の番号と直接比較できるようにします。組み合わされた一連の操作で元の番号が再現された場合、その番号は探していた番号の1つです。

+0

私のためにタイの背後にある論理を説明できるなら、本当に感謝します。私はいくつかのビット賢明な操作を参照してください、右か? –

+0

@ YousufEjazi007、done。 –

+0

あなたは神様です!私は感謝の仲間です! –

5

与えられたNは符号なし整数です。

if(N % 2 == 0 && (N-6) <= 14) 
{ 
    printf("Weird\n"); 
} 
+0

!(N%2) - 非常に悪いスタイル。ブール論理と算術との混合 – SomeWittyUsername

+0

はい、もちろんです。それは実際のロジックを隠しますが、バイトをソースコードに保存します。 –

+1

効率性はソースコードの保存ではありません。 (N%2)== 0は正確に同じバイナリを返します。 – SomeWittyUsername

10

なぜあなたはただ行うことはありません。

if (N % 2 == 0 && (N >= 6 && N <= 20)) 
{ 
    /* ... */ 
} 
+0

くそー、私は十分に速くはなかった:o – Ascam

+0

いいコードです。 +1 – raddevus

+0

これはOPの質問に対する私のコメント以上のものではありません。 – skypjack

関連する問題