태그 보관물: bit-manipulation

bit-manipulation

Java에서 이중 물결표 (~~)의 의미는 무엇입니까? i++) {

구아바의 소스 코드를 탐색 할 때 다음 코드 조각 ( hashCode내부 클래스 구현의 일부 CartesianSet)을 발견했습니다.

int adjust = size() - 1;
for (int i = 0; i < axes.size(); i++) {
    adjust *= 31;
    adjust = ~~adjust;
    // in GWT, we have to deal with integer overflow carefully
}
int hash = 1;
for (Set<E> axis : axes) {
    hash = 31 * hash + (size() / axis.size() * axis.hashCode());

    hash = ~~hash;
}
hash += adjust;
return ~~hash;

모두 adjust하고 hash있습니다 int들. 나는 자바에 대해 무엇을 알고에서 ~부정 비트 수단, 그렇게 adjust = ~~adjust하고 hash = ~~hash변경되지 않은 변수를 떠나야한다. 작은 테스트 (어설 션이 활성화 된 상태에서) 실행

for (int i = Integer.MIN_VALUE; i < Integer.MAX_VALUE; i++) {
    assert i == ~~i;
}

이것을 확인합니다. 구아바 사람들이 그들이하고있는 일을 알고 있다고 가정하면, 그들이해야 할 이유가 있어야합니다. 문제는 무엇입니까?

편집 주석에서 지적했듯이 위의 테스트에는 iequals가 포함되지 않습니다 Integer.MAX_VALUE. i <= Integer.MAX_VALUE항상 참 이므로 루프 외부에서 해당 케이스를 확인하여 루프가 영원히 반복되지 않도록해야합니다. 그러나 라인

assert Integer.MAX_VALUE == ~~Integer.MAX_VALUE;

컴파일러에 “동일한 표현식 비교”라는 경고 메시지가 표시됩니다.



답변

Java에서는 아무 의미가 없습니다.

그러나 그 의견은 GWT 전용 라인이며 Java에서 JavaScript로 컴파일하는 방법이라고 말합니다.

자바 스크립트에서 정수는 정수처럼 작용합니다. 예를 들어 최대 값은 2 ^ 53입니다. 그러나 비트 연산자 는 숫자를 32 비트 인 것처럼 취급하는데, 이는이 코드에서 원하는 것입니다. 다시 말해, ~~hash“치료하다”hash JavaScript에서 “32 비트 숫자로 . 특히, 비트 ~연산자는 하위 32 비트 만 보이 므로 하위 32 비트를 제외한 모든 비트를 버립니다 . 이는 Java의 오버플로 작동 방식과 동일합니다.

그것을 가지고 있지 않다면 객체의 해시 코드는 Java 랜드 또는 JavaScript 랜드 (GWT 컴파일을 통해)에서 평가되는지에 따라 달라집니다.


답변