2011-09-09 4 views
3

widthheight의 두 변수가 정수로 있습니다. 이들 중 어느 것도 양수 또는 음수 일 수 있습니다 (0이 아님). 자연스럽게 4 가지 경우가 있습니다. switch case 문에서 2 개의 변수 값의 4 개의 순열을 찾습니다.

지금은이 4 개의 각각의 경우에 다른 작업을 수행 할

  • width < 0 && height < 0
  • width > 0 && height < 0
  • width < 0 && height > 0width > 0 && height > 0
    1. 4 if 문을 사용하지 않고. 이 간단한 switch case

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

      당신은 3D 공간에서 다음 각 if를 사용하는 것보다 더 좋은 방법이없는 경우 3 개 길이 (x,y,z)과 같이 넣을 수 있도록

      이러한 경우를 집계하는 방법이 있나요 27 if 블록이있을 것입니다.

      나는 중요하다면 javascript을 사용하고 있습니다. 자바 스크립트에서

  • +2

    4 방향 '스위치'와 4 개의 상호 배타적 인 'if'블록은 기본적으로 동일한 것입니다. 3d 케이스에서 사실에 따라 27 가지 완전히 다른 작업 중 하나를 수행해야한다면 27 블록의 코드로 끝나게 될 것입니다 ... – AakashM

    +1

    ... 덧붙이 자면, 4 개 블록 (27 개 블록)이 실제로는 완전히 다른 것들을 수행하지 않을 것이라고 추측하고 있습니다. 사실, 모든 사람들이 똑같은 일을하도록 만들 수 있다는 것을 내기하고 싶습니다. 두 개 또는 세 개의 매개 변수는 '+ 1'과 '-1'값을 취합니다. – AakashM

    +0

    왜 블록이 27입니까? 차원 당 2 개의 선택 항목, 2^3 = 8이 있습니다.이 경우에도 0을 가질 수 없다고 가정합니다. – CaNNaDaRk

    답변

    4

    이 매우 쉽습니다, 그냥 거꾸로 조건을 설정 :이 또한 VB6/VBA에서가 아니라 C++와 C# 같은 많은 다른 languaguages에서 작동

    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: 
    
    } 
    

    합니다.

    여기에 간단한 증거 : 당신은 당신의 각 조건을 처리 할 수 ​​http://jsfiddle.net/avuxj/

    +0

    좋은 속임수. 나는 당신이 자바 스크립트에서 이것을 할 수 있는지 몰랐다. –

    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; 
    } 
    

    원하는 언어 이진 숫자 리터럴이없는 경우, 다음은 읽을 수 없습니다,하지만 당신은 의견이 있음을 해결할 수 있습니다.

    또한 01truefalse를 해석 지원 언어는 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 
    } 
    

    그리고 이것은 3 차원 경우에 일할 수 : 물론

    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 
    } 
    

    을 당신은 0 차원을 가질 수 없습니다 가정.

    1

    몇 가지 대답은 논리적으로 정확합니다. C에서이 작업을 수행했다면 :

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

    이것은 큰 차이를 만들 수 있습니다. 이런 상황에 9 가지 조건을 결합한 코드가 있습니다. 스위치는 점프 테이블로 바뀌며 수많은 조건을 평가하는 것보다 훨씬 빠릅니다. 분기가 없으며 점프 테이블 만 있습니다. 정말 아무것도 자바 또는 자바 스크립트를 말할 수 없습니다.

    는 또한 문 경우 중첩 할 수 있습니다

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

    내가 함께 상태 비트를 매쉬업 더 읽을 수 있도록 스위치를 사용하여 찾을 - 조건의 수가 증가 특히.

    관련 문제