5分でJavaの中の>>>>>>、<<

11254 ワード

>>>>>>と<<
結論:
>>右シフト、正数右シフト、高位補0、負数右シフト、高位補1>>>:右シフト、高位補0、正数負数を区別しない<注:1.左シフト右シフト符号ビットも一緒に移動する.高位低位補1/0とは、移動終了後に空になった位を全て補1/3とする.存在しない<<
正数にとって、>>と>>は同じで、いずれも右移高位補0は負数にとって、>>と>>は違います.>>右移高位補1,>>右移高位補0
左移乗と右削除を実现するには、>>と<负数用>>で正数になりますが、これ>>は何の役に立つのでしょうか...
次は以上の結論のコード検証です.
>>,>>>,<
テストコード:
@Test
public void test() {
	int a = 0b10011111111111111111111111111111;//    ,   32 
	int b = a>>2;
	int c = a>>>2;
	int d = a<<2;
	System.out.println("a   :"+a);
	System.out.println("a      :" + Integer.toBinaryString(a));
	System.out.println("a>>2   :"+b);
	System.out.println("a>>2      :" + Integer.toBinaryString(b));
	System.out.println("a>>>2   :"+c);
	System.out.println("a>>>2      :" + Integer.toBinaryString(c));
	System.out.println("a<<2   :"+d);
	System.out.println("a<<2      :" + Integer.toBinaryString(d));
}

出力:
	a   :-1610612737
	a      :10011111111111111111111111111111(32 )
	a>>2   :-402653185
	a>>2      :11100111111111111111111111111111(32 )
	a>>>2   :671088639
	a>>>2      :100111111111111111111111111111(30 )
	a<<2   :2147483644
	a<<2      :1111111111111111111111111111100(31 )

intは32ビットですが、表示時は1番目の1から表示されるのでa>>2は30ビットのみ、a<<2は31ビットのみ表示されます
テストコード:
@Test
public void test() {
	int a = -16;
	int b = a>>2;
	int c = a>>>2;
	int d = a<<2;
	System.out.println("a   :"+a);
	System.out.println("a>>2   :"+b);
	System.out.println("a>>>2   :"+c);
	System.out.println("a<<2   :"+d);
}

出力:
	a   :-16
	a>>2   :-4
	a>>>2   :1073741820
	a<<2   :-64

原符号、逆符号、補符号回顧:
  • 正数:原符号=逆符号=補符号
  • 負数:元のコード;逆符号=原符号は符号ビットを除いて逆をとる.補数=逆符号+1=原符号符号符号符号符号符号符号符号ビットを除く逆+1
  • 注:補数の補数=元の符号、すなわち符号ビットは不変で、残りのビットは逆+1をとる
    例:-20原号:1001 0100逆符号:1110 1011補符号:1110 1100補符号の補符号:1001 0011+1=1000100
    Javaで付与された値のレビュー:
    Javaには十進法のほかにバイナリ賦値,八進法賦値,十六進法賦値がある
    テストコード:
    @Test	
    public void test() {
    	int a = 10;//     
    	int b = 0b1010;//     
    	int c = 012;//     
    	int d = 0xa;//      
    	System.out.println("a = " + a);
    	System.out.println("b = " + b);
    	System.out.println("c = " + c);
    	System.out.println("d = " + d);
    }
    

    出力:
    	a = 10
    	b = 10
    	c = 10
    	d = 10
    

    まとめ:バイナリ付与:前に0 bを加える;8進法賦値:前に0を加算します.16進数賦値:前に0 xを加える;