2016-12-10 4 views
0

나는 이상한 문제에 봉착했다. 코드는 다음과 같습니다.왼쪽으로 조금 이동하면 대부분 1이되고 계산 방법은?

public class ShiftLeft { 

public static void main(String[] args) { 

     int c = 22; 
     int d = c << 3; 
     System.out.println("c << 3 = "+d); 
} 

} 

답변 : 176하지만 손으로 ​​계산 해 봅시다.

+22 = 0001 0110 
     1011 0000 <<3 

가장 왼쪽 비트는 1이므로 음수 여야합니다.

Sign + magnitude = 1011 0000 
     magnitude = 011 0000 
        100 1111 ---1s compliment 


101 0000 ---2s compliment 
adding left bit 1101 0000 =-80 

답변은 우리가 가장 왼쪽 비트를 부호로 계산하지 않으면 176이됩니다. 왜 그런가요?

+1

https://docs.oracle.com/javase/specs/jls/se8/html/jls-4.html#jls-4.2 –

답변

2

int (0000 0000 0000 0000 0000 0000 0001 0110)은 약 byte (0001 0110)으로 생각됩니다. 그러나 int 기본 유형은 비트가 아닌 32 비트 (더블 워드)입니다.

0000 0000 0000 0000 0000 0000 0001 0110 (2) 
<< 
3 
= 
0000 0000 0000 0000 0000 0000 1011 0000 (2) 
= 
176 (10) 
4

int가 8 비트 이상이기 때문에.

+0

가 8 비트 계산되는 경우 어떻게 대답 할 것인가? – mlhazan

+2

@ mlhazan : 왜 해보지 않으시겠습니까? Java의 8 비트 정수형은'byte'입니다. '<<'가 스펙에서 어떻게 작동하는지에 대한 전체 설명도 있습니다 (https://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.19). –

2

32 비트 정수 0000 0000 0000 0000 0000 0000 1011 0000은 음수가 아닙니다.