2012-05-09 5 views
-2

바이트 배열, 예를 들어 400 바이트 .... 그리고 나서 비트의 위치, 예를 들어 6이 있습니다.이 비트의 값 1입니까? 그래서 내 예에서는 반환 값이 true가됩니다.자바에서 바이트 배열의 비트 유효성을 검사하는 방법

예 :

final byte[] b = new byte[] { 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }); 

무엇 00000100 ....

+7

I는 – keyser

+0

'경우 (b [위치] == 1) 반환 질문을 이해할 수 없다 true; ' – Dandy

+1

달성하려고하는 작업에 정확하게 맞는 BitSet을 사용하지 말아야합니까? h? http://docs.oracle.com/javase/6/docs/api/java/util/BitSet.html –

답변

0

것 같습니다 :

비트 1은 첫 번째 바이트의 최상위 비트이고, 8은 첫 번째 바이트의 최하위 비트이고 비트는, 9 번째의 높은 바이트 비트 바이트 등.

이 그럼 당신은 사용할 수 있습니다

private boolean isSet(int index) { 
    int bitIndex = (index-1) % 8; 
    int byteIndex = (index-1)/8; 
    int bitMask = 1 << 7-bitIndex; 
    return (b[byteIndex] & bitMask) > 0; 
} 

을하지만, 당신이 (나를 위해)를 사용하면보다 자연적인 방법을 인덱스로 그 비트 0은 첫 번째 바이트에서 가장 낮은 비트했다, 그래서 7의 최상위 비트 비트 첫 번째 바이트는 8 최하위 비트하지만 (그래서 등) 번째 바이트의 상기가 될 수있다 :

private boolean isSet(int index) { 
    int bitIndex = index % 8; 
    int byteIndex = index/8; 
    int bitMask = 1 << bitIndex; 
    return (b[byteIndex] & bitMask) > 0; 
} 
+0

thx 많이 작동합니다. 왜냐하면 나는 그것을 반대로 계산합니다. 비즈니스 요구 사항 – hudi

0

당신이 바이트 뒤로 배열의 위치를 ​​계산하기 때문에 진정한 = 6 결과 POS =

public boolean bitAtPos (byte [] b, int pos) { 
    int el = b[pos/8]; 
    return ((el >> (8-(pos%8)) & 1) == 1); 
} 
+0

hm하지만 마지막 행은 부울이 아닙니다. – hudi

+0

답이 맞습니다. 당신은이 int를 1과 비교하는 것을 잊어 버린다. – hudi

+0

@hudi : 오, 네 말이 맞아. 수정 됨. –

-1
boolean validateValue(byte[] array, int numberToValidate, int position) { 
    return (array.length > position-1 && position >= 1) ? array[position-1] == numberToValidate : false; 
} 

이 방법을 사용하면 숫자에 대해 여러 번 사용할 수 있습니다. 당신은 유효성을 검사하고 싶습니다. 참고 : 유효하지 않은 위치를 매개 변수로 사용하면 false가 반환됩니다. 사전 유효성 검사 :
을 추가했습니다. 최선의 방법은 예외를 던지기 만하면됩니다. 당신이 당신의 비트는 다음과 같이 계산 것처럼

+0

죄송하지만 position은 바이트가 아닌 비트의 위치이기 때문에이 대답은 잘못되었습니다. 내 예제에서는 b [5]가 0을 1이 아닌 것으로 반환합니다. – hudi

+0

신경 쓰지 마세요, 마침내 질문을 이해했습니다. 다음 번에 더 나은 질문을하면 ... –

+0

왜냐하면 b = 4,0,0,0,0, .. 그래서 b [5] = 0 – hudi

관련 문제