2012-03-12 6 views
0

전화 관리에 대한 질문이 있습니다.결정을 통해 특정 방법을 호출하는 가장 빠른 방법

페이로드가 페이로드가 byte[] 인 메시지가 표시됩니다. 거기에있는 다른 비트는 다른 메소드를 호출합니다. 나는 바이트와 시프트 1 사이의 논리적 인 AND로 비트의 값을 얻었습니다. 특정 방법을 호출하기 위해 elseif 등을 사용했습니다. 그것을 실현할 또 다른 가능성이 있습니까, 아마도 HashMap 또는 뭔가?

적어도 최대 용량을 사용해야합니다. 자바 1.4

인사말, fnobbi

답변

0

전화하는 방법에 따라 다릅니다. 20보다 작 으면 int (4 바이트 - 하위 3을 사용)에서 간단한 비트 마스크 테스트를 if()과 함께 사용합니다. 예를 들어

:

public static void callMethod(byte[] bytes) { 
    int bits = (bytes[2] & 0xFF) << 16 + 
       (bytes[1] & 0xFF) << 8 + 
       (bytes[0] & 0xFF); 
    if ((bits & 1) > 0) { 
     methodForBit0Set(bytes); 
    } 
    if ((bits & 2) > 0) { 
     methodForBit1Set(bytes); 
    } 
    if ((bits & 4) > 0) { 
     methodForBit3Set(bytes); 
    } 
    // etc 
} 

당신이 단 하나의 방법은 다음, 당신은 ifs 사이 elses를 사용하는 것이 좋습니다 중지를 호출하고, 또한 순서에 가장 자주를 검사를 지시 할 수있는 경우 먼저 기대된다.

해시 맵을 사용하면 이 아니며 많은 테스트를 거쳤음에도 불구하고이 매우 빠른 작업보다 훨씬 빠릅니다. 읽기, 디버그 및 유지 관리가 더 쉽습니다.

+0

감사합니다. 기능 표가 없습니다 (예 : – fnobbi

+0

바이트를 마스크하여 부호없는 것으로 처리해야합니다. 'bits '는 단지 24 비트로'int '가 될 수 있습니다. 이것이 검색 할 패턴이라면 가장 낮은 비트 세트를 검색하고 그 값을 켭니다. –

+0

왜 오래 사용하고 있습니까? 아마도 int에서 사용하기를 원했을 것입니다. 왜냐하면 텍스트에서 언급 한 것처럼 너비가 4 바이트이기 때문입니다. long은 8 바이트이고 3 바이트 메시지의 경우 과잉입니다 ... – Durandal

0

심지어 자바 1.4, 스위치를 사용할 수 있습니다. 스위치는 다른 바이트가 상호 작용할 때 중첩 될 수 있습니다. 전화 할 수있는 방법이 1600 만 가지가 아니라고 생각합니다. (256^3)

+0

농담 하시겠습니까? 나는 비트 마스크를 추측하고있다. .. 당신은 모든 콤보를 맞추기 위해 필요한 테이블의 크기를 상상할 수 있는가 ??? – Bohemian

+0

내가 말했듯이, 1600 만 가지의 다른 메소드를 호출 할 필요가 없다고 가정합니다. 어떤 경우에는 발생할 수있는 단순화가 있어야합니다. 방법 당 케이스 그룹이 두 개 이상 있으면 안됩니다. –

관련 문제