Programing

자바에서 더블틸드(~~)의 의미는 무엇인가?

c10106 2022. 4. 19. 20:55
반응형

자바에서 더블틸드(~~)의 의미는 무엇인가?

구아바의 소스 코드를 탐색할 때, 나는 다음과 같은 코드 조각(이행의 일부)을 우연히 발견했다.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;
}

이것을 확인하다.과바족들이 자기들이 하는 일을 알고 있다고 가정한다면, 그들이 이렇게 할 이유가 있을 것이다.문제는 뭐냐?

EDIT 코멘트에서 지적한 바와 같이, 위의 테스트는 다음의 경우를 포함하지 않는다.i대등하다Integer.MAX_VALUE.이후i <= Integer.MAX_VALUE항상 진실이야, 영원히 반복되지 않도록 루프를 벗어난 경우를 확인해야 해.하지만, 그 선은

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

컴파일러는 "동일한 표현 비교"라고 경고하는데, 이 경고는 거의 효과가 없다.

자바에서는 아무 의미도 없다.

하지만 그 코멘트는 그 선이 특별히 GWT를 위한 것이라고 말하고 있는데, 이것은 자바스크립트에 자바스크립트를 컴파일하는 방법이다.

자바스크립트에서 정수는 일종의 더블-액션-인정자 같은 것이다.예를 들어, 그들은 최대 값이 2^53이다.그러나 비트 연산자는 숫자를 32비트인 것처럼 취급하는데, 이것이 바로 이 코드에서 원하는 것이다.바꾸어 말하면, 환언하면~~hash"라고 말하다.hash자바스크립트의 "32비트 번호"로 표시됨.구체적으로, 하위 32비트를 제외한 모든 비트를 삭제한다(비트윈도 이후).~연산자는 아래 32비트만 본다)로, 이는 자바의 오버플로우가 작동하는 방식과 동일하다.

만약 그것이 없다면, 객체의 해시 코드는 (GWT 컴파일을 통해) 자바랜드에서 평가되는지 자바스크립트랜드에서 평가되는지에 따라 달라질 것이다.

참조URL: https://stackoverflow.com/questions/29736952/what-is-the-meaning-of-double-tilde-in-java

반응형