2015-01-24 3 views
0

내가 좋아하는 일부 코드를 찾고 있었어요 : 경로에 따라 호출 할 발신자정수 사이의 비트 AND 연산자 사용의 이점은 무엇입니까?

public int someMethod(String path, int maxCallers) { 

     int hash = path.hashCode(); 
     int caller = (hash & Integer.MAX_VALUE) % maxCallers; 
     return caller; 
    } 

이 방법을 반환합니다. maxCallers 값이 4이면 호출자 값은 0-3 사이 여야합니다. 이제 여기서 나는 hash & Integer.MAX_VALUE을 사용하는 것을 이해하지 못합니다. 내가 생각할 수있는 한 가지 이유는 해시 코드가 음수 일 수 있기 때문에 프로그래머가 양수를 원하지만 내 이해가 잘못되었다고 생각합니다. 누군가가 비트 AND 연산자의 사용법을 여기서 설명 할 수 있습니까?

+0

을 귀하의 이해가 실제로 옳습니다. 그건 사인 비트를 떨어 뜨리는 가장 빠른 방법입니다. – dasblinkenlight

+0

나는 감사합니다. @dasblinkenlight – user3396729

답변

0

귀하의 가정은 정확합니다. 해시 값이 음수 인 경우 정수의 부호를 제거합니다. ANDInteger.MAX_VALUE과 함께 사용하면 정수에서 부호 비트가 제거됩니다. 이 정수의 절대 값 점점 다릅니다 ". 내가 생각할 수있는 이유 중 하나는 프로그래머가 해시 코드로 양수는 음수가 될 수 원하는,하지만 난 나의 이해는 여기에 잘못된 생각"

int hash = -1; 
int caller = (hash & Integer.MAX_VALUE) % 4; // returns 3 

int hash = -1; 
int caller = Math.abs(hash) % 4; // returns 1 
+0

답장을 보내 주셔서 감사합니다. 거기에 어떤 다른 접근법이있을 수 있습니까? 아니면 더 빠른 방법일까요? – user3396729

+0

예. 부호 비트를 제거하는 가장 빠른 방법입니다. – manouti

+0

도와 주셔서 감사합니다. :) – user3396729