2013-01-20 1 views
2

java.util.Hashtable#get(K key)의 일부인 hash function code은 다음을 수행합니다. int index = (hash & 0x7FFFFFFF) % tab.length;. 이 바이너리 '및'연산은 부호 비트를 재설정하는 것만을 의미합니까? 따라서 부정적인 테이블 액세스는 피하십시오.자바 Hashtable 해시 조회의 비트 단위 AND?

업데이트 : '와'는 0x7FFFFFFF이고 0xEFFFFFFF가 아닌 것은 나를 혼란스럽게합니다. 왜 기호는 단일 비트가 아닌 전체 바이트를 필요로합니까?

+0

인덱스는 음수이어야하며 가장 높은 비트를 지우면 값이 양수임을 확신 할 수 있습니다. 그리고'%'다음에 양수가됩니다. – MrSmith42

+1

당신의 업데이트는 저를 괴롭힙니다. 0xE와 0x7 모두 단일 비트가 설정되지 않았습니다. 유일한 차이점은 어떤 비트가 설정되지 않았는지입니다. E는 1110이므로 4 번째 최상위 비트는 설정 해제되며 7은 0111입니다. 따라서 최상위 비트는 설정되지 않습니다. 부호 비트는 최상위 비트입니다. – delnan

답변

5

네, 맞습니다. 이는 해시 테이블의 기본 배열에 대한 음수 인덱싱을 방지하기위한 것입니다.

C 또는 C++와 같은 부호없는 정수 유형이있는 언어의 경우 해시 함수에서 부호없는 값을 사용하면이 문제를 피할 수 있습니다.

편집 :0x7FFFFFF0xEFFFFFF 대 이유에 대한 새로운 질문을 감안할 때 -이 번호의 첫 번째는이 속성이없는 0이 두 번째로 설정 상위 비트가 모두 1이다; 1110 다음에 1이 많이 나온다. 따라서 첫 번째 마스킹은 1 비트를 지우는 반면 두 번째 마스킹은이 작업을 수행하지 않을 수 있습니다.

희망이 도움이됩니다.

2

'와'는 0x7FFFFFFF가 아니고 0xEFFFFFFF는 나와 혼동하지 않는다는 사실. 왜 기호는 단일 비트가 아닌 전체 바이트를 필요로합니까?

0x7FFFFFFF는 맨 위 비트입니다. 바이너리에서는 01111111111111111111111111111111입니다. 0xEFFFFFFF는 11101111111111111111111111111111이므로 다른 비트를 마스크합니다.