2010-04-16 4 views
1

0xFF7F와 그 아래에있는 두 줄에서 무슨 일이 일어나고 있는지 이해하는 데 문제가 있습니다. 어느 정도 그것을 설명하는 링크가 있습니다. 0xFF7F >> posBit) & oldByte가) & 0x00FF 는 3 개 값 '이 읽을 수 가정하는 방법을 함께 AND 연산 또는 있어야하는 경우 http://www.herongyang.com/java/Bit-String-Set-Bit-to-Byte-Array.html 나도 몰라. 누구나 여기서 어떤 일이 일어나고 있는지 좀 더 분명하게 알 수 있다면, 나는 그것을 크게 고맙게 생각할 것입니다.비트 시프트 및 16 진법 코드를 사용하는 setBit Java 메소드 - 질문

private static void setBit(byte[] data, 
           final int pos, 
           final int val) { 
     int posByte = pos/8; 
     int posBit = pos%8; 
     byte oldByte = data[posByte]; 
     oldByte = (byte) (((0xFF7F>>posBit) & oldByte) & 0x00FF); 
     byte newByte = (byte) ((val<<(8-(posBit+1))) | oldByte); 
     data[posByte] = newByte; 
    } 

은 selectBits 메서드에서 매개 변수로이 메서드에 전달되었습니다. setBit (out, i, val); out = 바이트 [] out = 새 바이트 [numOfBytes]; (numOfBytes는이 상황에서 7 일 수 있습니다.) i =는 숫자 [57]이고, 56 정수를 유지하는 PC1 int 배열의 원래 숫자입니다. val =는 getBit() 메소드의 바이트 배열에서 가져온 비트입니다.

답변

2

우선 0xFF7F1111 1111 0111 1111입니다. 이 값은 매개 변수로 전달한 비트에서 계산 된 비트 수만큼 오른쪽으로 이동합니다 (설정하려는 비트 수만큼).

는 제 3 비트 posBit = 3 % 8 = 3을 지정한다면

이 값은 다음 수정하는 일본어 바이트와 AND 연산된다
0xFF7F 1111 1111 0111 1111 
>> 3 0001 1111 1110 1111 

결과는 모든 비트를 제외한 oldBit 원래의 비트와 동일하게 유지된다는 것이다을 AND 당신이 예를 oldByte == 0111 1010에 대해 가지고있는 0 비트와 함께, 가정, 당신은 얻을 것이다 :

그런 다음 값이 0xFF와 AND 연산한다
0111 1010 
& 1110 1111 
------------- 
    0110 1010 

단지 거라고 어떤 비트를 폐기 캐스트를 수행하기 전에 바이트를 맞추지 않아야합니다 (최소한 9 번째 비트이기 때문에).

+0

비록 진수 숫자의 의미는 무엇입니까? 이 경우 0xFF7F와 0x00FF가 선택된 이유는 무엇입니까? –

+0

그들은 _masks_이며, 일부 비트를 선택하기 위해 AND 연산자와 함께 사용됩니다. 첫 번째 경우 0xFF7F는 지정된 비트를 설정하여 작업하려는 코드를 제외하고 1을 모두 가질 수 있기 때문에 사용됩니다 (__pos__에 따라 이동됩니다). 0x00FF는 바이트 쌍의 가장 낮은 바이트를 선택하는 데 사용되지만, 이는 하위 8 비트 만 선택하기 때문에 사용됩니다. – Jack

1

이 될 것이라고 쓸 수있는 더 좋은 방법 :

private static void setBit(byte[] data, int index, boolean value) 
{ 
    final int byteIndex = index/8; 
    final int bitIndex = 7 - (index % 8); 

    final byte mask = (byte) (1 << bitIndex); 
    final byte valueBit = value ? mask : 0; 

    data[byteIndex] = (byte) ((data[byteIndex] & ~mask) | valueBit); 
}