2012-02-09 3 views
4

는 다음 자바 코드를 고려자바 시프트 연산자

byte a = -64; 
System.out.println(a << 1); 

코드의 출력은 -128

이 출력 이유를 파악하기 위해 다음과 같이 I 시도 :

64 = 0 1000000 (MSB는 부호 비트)

-64 = 1 1000000 (토우의 보완 형식)

이동 후 예상 출력 : 1 0000000 (MSB는 부호 비트이기 때문에 0과 같습니다)

내가 누락 된 부분을 설명해 주실 수 있습니다.

답변

1

시프트 연산자에서 부호 비트는 무시됩니다. 그래서 1 1000000 < < 1은 -128 인 10000000입니다. 문제가 무엇입니까?
저희의 기계는 two's complement을 사용하여 숫자를 나타냅니다 (부호와 부호 없음). 음수 기계를 나타내는 것은 긍정적이다 부정하고 추가 1.
-128입니다 10000000 + 1 = 01,111,111 + 1 = 10000000
편집 :!
내가 잘못했다, 단지 오른쪽 시프트 연산자의이 부호 비트를 무시. 10100000 < < 1 == 01000000
서명되지 않은 오른쪽 시프 팅에는 부호가 너무 바뀌는 연산자 >>>가 있습니다.
>> 1 11000000 10100000 및 11000000 == >>> == 1은 01,100,000

+3

부호 비트가 무시되는 경우 결과가 부호있는 (음수) 숫자가되는 방법?! – siva636

+1

"무시 된"단어는 옳은 단어라고 생각하지 않지만, 요점은 생각했던대로'10000000 == -128'이 아니라 '0'입니다. –

+0

내 대답을 편집했습니다. – shift66

2
10000000 is -128 
10000001 is -127 
10000010 is -126 
... 

그래서 100000000 아니다. 귀하의 산출물은 -128입니다.

+0

2의 보수를 10 진수로 변환하는 직접 산술적 방법이 있습니까? – siva636

+0

'int i = Integer.parseInt ("10000000", 2); '를 의미합니까? –

0

<< 2

>> 서명 비트를 고려하지 않는 이동 작업을 수행하는 동안, 2

으로 나누기를 의미하고 번성하여 의미합니다.

+0

그러나 출력으로 부호있는 숫자를 표시하고 있기 때문에 기계가 부호 비트를 고려하고있는 것 같습니다. – siva636

1

2의 보수로, MSB는 단순한 부호가 아니며, 보완적인 것일 수도 있습니다. 8 년이 보완, 비트

10000000

= 0x80으로 = -128

+0

변환에 대해 자세히 설명해주십시오. 10000000 = 0x80 = -128 (0x80을 이해할 수 없습니다.) – siva636

+1

@MISS_DUKE [2의 보수] (http://en.wikipedia.org/wiki/Two%27s_complement) . – Jesper

3

-128의 2의 보수 표현 따라서 결과가 정확한지, 10000000이다.

0

궁금합니다. << 1 (모든 세부 사항 무시)은 "2로 곱하십시오."-64 * 2 = -128. 그런데 왜 그것이 정말로 -128인지 궁금합니까?

2

이 프로그램

System.out.println(Integer.toBinaryString(-64)); 
System.out.println(Integer.toBinaryString(-64 << 1)); 
System.out.println("-64 << 1 = " + (-64 << 1)); 

인쇄

11111111111111111111111111000000 
11111111111111111111111110000000 
-64 << 1 = -128 

하면 -64 < < 1 시프트 1 (가장 낮은 비트에 의해 남겨진 모든 비트를 제외 -64과 같은 것을 알 수있다 0이됩니다)

+0

'-128'을 표현하고 싶다면 왜이 이상한 방식으로 쓰고 싶습니까? – CodyBugstein

+0

@Imray'x << 1'을 써야 할 수도 있고 x = -64가 -128이된다는 것을 알아야 할 수도 있습니다. 나는 당신이 얻는 것을 알기를 원하지 않는다면'-64 << 1'을 쓸 좋은 이유를 생각할 수 없다. –

관련 문제