2013-03-24 3 views
10

비트 시프트 연산자로 작업 할 때 흥미로운 시나리오가 나타났습니다. 두 번째 피연산자가 음수이면 비트 시프트 연산은 어떻게 작동합니까? .음수로 시프트하는 비트 시프트 연산자

즉, < <b이고, "< <"은 비트 패턴을 a의 b 비트만큼 왼쪽으로 시프트합니다. 그러나 b가 깔끔하지 않다면 런타임에 오류가 발생하지 않아야합니까?

아래 코드를 성공적으로 실행할 수는 있지만 어떻게 작동하는지 이해할 수 없습니까? 입력

bitwiseleftShift('A');// ASCII 65 
    bitwiseleftShift('0'); // ASCII 48 

public static void bitwiseleftShift(char testChar) 
{ 
    int val=testChar-'a'; 
    int result= 1<<val; 
    System.out.println("bit wise shift of 1 with val="+val+" is "+result); 
} 

'는'누군가가 나이 어떻게 작동하는지 이해하는 데 도움이 수 97 인에 대한

bit wise shift of 1 with val=-32 is 1 
    bit wise shift of 1 with val=-49 is 32768 

ASCII 결과?

답변

9

하지만 b가 깔끔하지 않은 경우 런타임에 오류가 발생하지 않아야합니까? 왼쪽 피연산자의 승진 타입이 INT 인 경우

가 오른쪽 피연산자의 다섯 최하위 비트가

을 사용 : Java 언어 사양, section 15.19에 따라하지

이동 거리로. 이는 오른 쪽 피연산자가 마스크 값 0x1f (0b11111)를 갖는 비트 논리 AND 연산자 & (15.22.1)에 적용되는 것과 같습니다. 따라서 실제 사용되는 이동 거리는 항상 0에서 31까지의 범위입니다.

실제로 -32의 이동은 0의 이동으로 끝나고 -49의 이동은 실제로 15의 이동으로 끝납니다. 따라서 결과는 보았습니다.

+0

감사합니다. 존! 그게 대답이야 .. SO는 내가 6 분이 넘을 때까지 대답을 받아 들일 수 없다고 말한다 : (그런데, 큰 팬! 다행스럽게 대답했다! – prashantsunkari