2011-09-09 5 views
3

私は2つの変数、widthheightを整数として持っています。これらのいずれも正または負(ゼロではない)です。自然には4つのケースがあります。switch case文で2つの変数値の4つの置換を検出します

  1. width > 0 && height > 0
  2. width > 0 && height < 0
  3. width < 0 && height > 0
  4. width < 0 && height < 0

今、私はif文4を使用せずに、これら4例ごとに異なるアクションを取ることにしたいです。それは、単純なswitch case

switch(aggregate){ 
    case 1: 
    case 2: 
    case 3: 
    case 4: 
} 

あなたが持っている3D空間で、その後それぞれのifを使用するよりは良い方法がない場合は3つの長(x,y,z)として置くことができるように

これらのケースを集約する方法はあります27 ifブロックがあります。

私はjavascriptを使用しています。 javascriptの

+2

4ウェイの 'switch'ブロックと4つの相互排他的' if'ブロックは基本的に同じものです。あなたの3dのケースでは、事実に応じて27の完全に異なるものの1つを実際に実行する必要がある場合は、27ブロックのコードで終わるでしょう。 – AakashM

+1

...追加するには、私は4ブロック(または27ブロック)が実際には完全に別のものをやっていないことを推測しています - 実際には、すべて同じ*ものをやることができると賭けていました2つまたは3つのパラメータが値「+ 1」および「-1」をとる。 – AakashM

+0

ブロックが27の理由次元ごとに2つの選択肢、2^3 = 8があります。この場合も0を持つことはできません。 – CaNNaDaRk

答えて

4

これはちょうど逆さまの状態を回し、非常に簡単です:

switch(true) 
{ 
    case (width > 0 && height > 0): 
     break; 
    case (width > 0 && height < 0): 
     break; 
    case (width < 0 && height > 0): 
     break; 
    case (width < 0 && height < 0): 
     break; 

    default: 

} 

また、これはVB6/VBAではなく、C++やC#のような他の多くのlanguaguagesで動作します。

は簡単な証拠です:あなたはあなたの条件のそれぞれを扱う可能性がhttp://jsfiddle.net/avuxj/

+0

良いトリック。私はあなたがjavascriptでこれを行うことができるかはわかりませんでした。 –

3

(正の幅、高さ正)、単一の論理的属性として、それ以上の進数とスイッチにそれらを結合します。

擬似コード:

int v = (width > 0 ? 0 : 1) << 1 | (height > 0 ? 0 : 1) << 0; 
switch (v) { 
    case 0b00: 
    // width < 0 && height < 0; 
    break; 
    case 0b01: 
    // width < 0 && height > 0; 
    break; 
    case 0b10: 
    // width > 0 && height < 0 
    break; 
    case 0b11: 
    // width > 0 && height > 0 
    break; 
} 

お好みの言語がバイナリ数値リテラルを持っていない場合は、それが読み取り可能ではありませんが、あなたは、コメントでそれを修正することができるかもしれません。

0として1としてtruefalseを解釈するサポートする言語はint v = ...ラインを短くするのを助けることに注意してください。

1

それはすべて少し混乱していますが、あなたは

var bits=0; 
if(width > 0) { 
    bits+=1; 
} 
if(height > 0) { 
    bits+=2; 
} 

switch{bits} { 
    case 0: //both negative 
     //something 
     break; 
    case 1: //width positive, height negative 
     //something 
     break; 
    case 2: //width negative, height positive 
     //something 
     break; 
    case 3: //both positive 
     //something 
     break; 
} 

を行うことができます。 (特に3つの値がある場合)。変数を使用してコードビットをより明確にすることができます。

var WIDTH_POSITIVE_BIT=1; 
var HEIGHT_POSITIVE_BIT=2; 

var bits=0; 
if(width > 0) { 
    bits+=WIDTH_POSITIVE_BIT; 
} 
if(height > 0) { 
    bits+=HEIGHT_POSITIVE_BIT; 
} 

switch{bits} { 
    case 0: //both negative 
     //something 
     break; 
    case WIDTH_POSITIVE_BIT: //width positive, height negative 
     //something 
     break; 
    case HEIGHT_POSITIVE_BIT: //width negative, height positive 
     //something 
     break; 
    case WIDTH_POSITIVE_BIT+HEIGHT_POSITIVE_BIT: //both positive 
     //something 
     break; 
} 

これは、コードをもっとはっきりさせるのに役立たないと言いたいと思います。

1

少しのオーバーヘッドを追加することなくこれを行うことはできません。

s = (width < 0) ? 0 : 1; 
s += (height < 0) ? 0 : 2; 

switch(s) { 
    case 0: // 00 => both < 0 
    case 1: // 01 => width > 0, height < 0 
    case 2: // 10 => width < 0, height > 0 
    case 3: // 11 => both > 0 
} 

そして、これが3Dの場合のために働くことができます:あなたは0次元を持つことができないと仮定もちろん

s = (width < 0) ? 0 : 1; //First bit for width 
s += (height < 0) ? 0 : 2; //Second bit for height 
s += (depth < 0) ? 0 : 4; //Third bit for depth 

switch(s) { 
    case 0: // 0 0 0 
    case 1: // 0 0 1 
    case 2: // 0 1 0 
    case 3: // 0 1 1 
    case 4: // 1 0 0 
    case 5: // 1 0 1 
    case 6: // 1 1 0 
    case 7: // 1 1 1 
} 

1

いくつかの回答は論理的に正しいです。

s = ((width<0)<<1) | (height<0); 
switch(s) { 
.... 
} 

これはC言語でこれを行っていた場合、これは大きく異なる可能性があります。私はこのようなスイッチに9つの条件を組み合わせたコードを持っています。スイッチはジャンプテーブルに変わり、多くの条件を評価するよりはるかに高速です。分岐はなく、ジャンプテーブルだけです。私は本当に何でもJavaやJavaスクリプトを話すことはできません。 if文

あなたはまた、入れ子になったん可能性があります - 条件の数が増える場合は特に

if (witdh<0) { 
    if (height<0) { 
     // both negative 
    } 
    else { 
     // only width negative 
    } 
} 
else { 
    if (height<0) { 
     // only height negative 
    } 
    else { 
     // both positive 
    } 
} 

を私は一緒に条件ビットをマッシュして読みやすくするためにスイッチを使用して見つけます。

関連する問題