2013-11-26 1 views
0

아래 코드를 이해하려고합니다."& 0xFF"및 ">>>"이동은 무엇을합니까?

getKey() 메서드는 문자열을 반환하고 getDistance()는 double을 반환합니다. 이 코드는 String (키)과 Double (거리) 쌍을 포함하는 클래스에서 가져온 것입니다.

더 구체적으로 말하자면, 나는 변화를하는 선이 무엇을하는지 확신 할 수 없다.

public void serialize (byte[] outputArray) { 

    // write the length of the string out 
    byte[] data = getKey().getBytes(); 
    for (int i = 0; i < 2; i++) { 
     outputArray[i] = (byte) ((data.length >>> ((1 - i) * 8)) & 0xFF); 
    } 

    // write the key out 
    for (int i = 0; i < data.length; i++) { 
     outputArray[i + 2] = data[i]; 
    } 

    // now write the distance out 
    long bits = Double.doubleToLongBits (getDistance()); 
    for (int i = 0; i < 8; i++) { 
     outputArray[i + 2 + data.length] = (byte) ((bits >>> ((7 - i) * 8)) & 0xFF); 
    } 
} 

어떤 도움을 주시면 감사하겠습니다.

+4

매운 디테일 : 바이트 이동이 아닌 비트 이동입니다. 이 운영자가 수행하는 작업을 확인하기 위해 문서를 살펴 보셨습니까? –

+0

음 ... 8의 배수로 조금씩 바뀌기 때문에 그는 실제로 바이트를 이동하고 있습니다 –

답변

2

비트 연산자로 Java의 tutorial을 읽는 것으로 시작하십시오. 요컨대 :

>>>는 부호 오른쪽 시프트

& 0xFF에게 인 것이 AND 연산이 0xFF

2

>>>(bits >>> ((7 - i) * 8))의 결과 것은 오른쪽 시프트 연산자 부호이다. 이것은 또한 부호 비트를 이동시킵니다.

& 0xFF은 8 비트 (바이트) 값을 만들기 위해 비트를 유지합니다. 그렇지 않으면 약간의 가비지가있을 수 있습니다.

+0

그리고 쓰레기가 생기지 않으면 * sign-extendet 값 *을 얻습니다. – Durandal

+0

@Durandal : 사실, 그것은 유효하고 훌륭한 가치입니다. 최종 가치의 관점에서 쓰레기 값. – deepmax

+0

그러나 첫 번째 for 루프에서 발생하는 시프 팅을 살펴보면 and 연산자가 중복되지 않습니까? outputArray [i] = (byte) ((data.length >>> ((1-i) * 8)) & 0xFF); 0xFF가 255 또는 1111111이고 루프 때문에 (1-i) * 8은 0 또는 8 일 수 있습니다. 0 & 0xFF는 0이고 8 & 0xFF는 8입니다. 또한 구문 나 자신이 정확하게 질문에, 내가 물어보고 싶은 것은 위의 코드의 "요지"가 무엇인가하는 것이다. 첫 번째 루프는 "// 문자열의 길이를 쓰십시오"라고 주석 처리 된 이유는 무엇입니까? 길이를 저장하는 것과는 무슨 상관이 있습니까? 왜 그것을 outputArray [1]에 저장하지 않습니까? –