2016-07-22 2 views
-4

논리적 인 오른쪽 및 왼쪽 시프트 (>>> 및 < < 사용)를 수행하려고합니다. 불행히도 나는 시프트 양이 32보다 클 때 모듈을 사용하여 비트를 회전시키고 비트를 올바른 위치로 이동시키는 것을 볼 수 있습니다. 그것은 단지 그것들을 바꾸는 것이 아닙니다. 어떻게 피할 수 있습니까? CentOS에서 java 7을 사용합니다. 업데이트 :자바에서 결과가 바뀜

public static void main(String[] args) { 
    int a = 0xc0000003; 
    int b = a >>> 32; 
    int c = 0xc0000003; 
    int d = c << 36; 
    System.out.println("b=" + b + ", d=" + d); 
} 

출력이 b=-1073741821, d=48입니다 : 예제와 함께 연주 후 나는 버그가 있다고 생각합니다. 왜? 어떻게하면 C에서와 같이 논리를 왼쪽이나 오른쪽으로 옮길 수 있습니까? 자바

+2

이들은 "[비트 시프트 연산자] (https://docs.oracle.com/javase/tutorial/java/nutsandbolts/op3.html)"라고합니다. 그들은 * shift *, rotate *하지 않습니다. 그들이 회전한다는 아이디어를 어디에서 얻었습니까? – Andreas

+0

문제를 보여주는 [mcve]를 제공해주십시오. –

+2

20 년이 넘은 언어가 그런 사소한 버그를 가지고있는 것보다 뭘하고 있는지 잘 모를 것입니다. – eldo

답변

0

는 오른손 값만큼 전체 시프트는 아니지만 이것은 대답 : 왼쪽 피연산자의 추진 형 다음 만 다섯 최하위 비트 INT 경우

오른쪽 피연산자의 0은 거리 거리로 사용됩니다. 오른손 피연산자가 비트 논리 AND 연산자 & (§15.21.1)과 마스크 값 0x1f (0b11111) 인 것처럼 보입니다. 따라서 실제로 사용되는 이동 거리는 항상 범위 0에서 31까지입니다.

승격 된 유형의 왼쪽 피연산자가 긴 경우 오른쪽 피연산자의 최하위 비트 여섯 개가 시프트 거리로 사용됩니다. 이는 오른손 피연산자가 비트 논리 AND 연산자 & (15.22.1)과 마스크 값 0x3f (0b111111) 인 것처럼 보입니다. 따라서 실제 사용되는 이동 거리는 항상 이고 범위는 0에서 63까지입니다.

The Java® Language Specification에서 가져온 것. 나를 위해,이 동작은 매우 직관적이지 않습니다 ...

관련 문제