2016-12-10 7 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

byte0001 0110)としてint0000 0000 0000 0000 0000 0000 0001 0110)と考えています。しかし、intプリミティブ型は、8ビットだけでなく、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は負ではありません。

関連する問題