자바에서 더블틸드(~~)의 의미는 무엇인가?
구아바의 소스 코드를 탐색할 때, 나는 다음과 같은 코드 조각(이행의 일부)을 우연히 발견했다.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
'Programing' 카테고리의 다른 글
JSON을 맵으로 변환 (0) | 2022.04.19 |
---|---|
확인란을 Vuex 저장소에 바인딩하는 방법? (0) | 2022.04.19 |
VueJS 라이프사이클에서 소품 업데이트 시기 (0) | 2022.04.19 |
필터를 사용하여 배열에서 개체의 여러 키 값을 검색하는 방법 (0) | 2022.04.19 |
coudamalloc()의 사용.왜 이중 포인터가 되는 거지? (0) | 2022.04.19 |