2016-09-09 6 views
2

에 IF..THEN 대 내가비트 마스크는 자바 스크립트

if (a && b && c) { func1() } 
else if (a && !b && c) { func2() } 
else if (!a && b && !c) { func3() } 
... 

처럼, 다른 장소에서 플래그를 검사 꽤 많이 포함 된 응용 프로그램 일하고 것은 때로는 하나의 순서 (10) 검사가있을 수 있음을 발생합니다.

나에게 3 번 이상 검사 할 때 매우 부피가 커집니다. 비트 연산과 bitmasks technique에 대해 읽었습니다. 우아한 솔루션을 제공 할 수 있다고 생각합니다.

다른 수준의 프로그래머가있는 실제 프로젝트에서 이러한 방법을 사용하는 것이 좋은 방법인지 궁금합니다. 스마트 패스가 아니라 코드를 좀 더 우아하게 만들려고 노력하면서, 내가 계속 if...else을 사용해야합니까, 아니면 비트 연산을 사용해야합니까?

+1

imho, 팀 동료는 비트 연산을 배워야합니다. 즉, 현실적인 예를 제공하지 않기 때문에 실제로는 좋은 선택이라고 할 수 없습니다. - | – leaf

+1

나는 비트 마스크가 얼마나 노출되어 있는지에 달려 있다고 말할 수 있습니다. 'a, b, c '에 대한 마스크가 주어지면 팀 메이트는'b = false'로 설정하기 위해'mask = mask^2'라고 쓰거나'set_param (name, value)'와 같은 추상화를 제공하고 handle XORing the hood? 어떻게 모든 사람이 10 개의 매개 변수의 순서를 추적하는지 확인 하시겠습니까? – pawel

답변

0

예 비트 방식이 더 좋은 해결책이라고 생각합니다.

const ACTIONS = { 
    0: func0, 
    1: func1, 
    2: func2, 
    3: func3, 
    4: func4 
    // ... 
} 

ACTIONS[a | b | c]() 
당신은 그것을 명확 진 리터럴의 경우 라벨로switch 블록을 사용하여 찾을 수 있습니다
0

:

switch (foo){ 
case 0b111: /*corresponds to true-like a, b, and c*/ 
    func1(); 
    break; 
case 0b101: /*corresponds to true-like a and c*/ 
    func2(); 
    break; 
fooa, b의 적절한 기능입니다

등 및 c 아마도 4 * a + 2 * b + c 같은 것을 사용하여 생성됩니다.

+0

대소 문자의 양은 정수의 크기에 의해 제한된다는 점에 유의하십시오. 예를 들어, 32 가지 이상의 값을 테스트 할 수없는 경우도 있습니다. – leaf

+2

32 개의 별도 플래그가 아닙니까? 가능한 경우의 32 승수에 2를줍니다! – Bathsheba

+0

32 개의 "매개 변수"를 의미합니다. 죄송합니다 .-) – leaf