2018-04-24 JAVAシフト演算子

2921 ワード

シフト演算子操作の対象はバイナリのビットであり,int型整数をシフト演算子で単独で処理することができる.シフト演算子は3種類あります(<>,>>>>)
1,<<左シフト演算子,演算子左のオブジェクトを左にシフト演算子右に指定したビット数(下位で0を補う)x<<3
2,>>符号右シフト演算子があり、演算子の左側のオブジェクトを演算子の右側に指定したビット数だけ右に移動します.シンボル拡張機構を用いる、すなわち、値が正であれば高位で0を補い、値が負であれば高位で1を補う.x>>3
3,>>>符号なし右シフト演算子、演算子の左のオブジェクトを右にシフト演算子の右に指定した桁数.0拡張機構を採用し、すなわち、値の正負にかかわらず、高位で0を補う.x>>>3
コンピュータにintが符号化されて記憶されているため、実際の運転時に符号化されてシフト操作が行われるのは、例えば10の符号化された符号化が、例えば、10の符号化された符号化された符号化が、1,000,000,000,01010である(正数の逆符号化、符号化が元の符号と同じである)
            00000000 00000000 00000000 00001010
 10 << 2    00000000 00000000 00000000 00101000        2 ,   0    :40
 10 >> 2    00000000 00000000 00000000 00000010       2 0(  ),         :2
 10 >>>2    00000000 00000000 00000000 00000010       2 0,          :2

-10の符号化は、11111111 11111111 11111111 11110110である
            11111111 11111111 11111111 11110110
-10 << 2    11111111 11111111 11111111 11011000        2 ,   0   :-40
-10 >> 2    11111111 11111111 11111111 11111101       2 1(  ),          :-3
-10 >>>2    00111111 11111111 11111111 11111101       2 0,          :1073741821

以上より,数値がオーバーフローしていないことを前提として,正数と負数に対して左シフト1ビットはいずれも2を乗じた1次方に相当し,左シフトnビットは2を乗じたn次方10<正数右シフトについては、2で割ったn次(整数)10>>n=10/2^n 10>>2は10/2^2=2に相当するが、負数の右シフトについては算術的な意味はない
計算速度から言えば,シフト演算は算術演算よりも速いので,乗除法の代わりに条件が満たされた場合にシフトを採用することができる.
シフト後の数字が境界を越えてしまうと、乗除法に代わる意味がなくなります
public class AA {
        public static void main(String args[]) {

        System.out.println("  10  ");
        System.out.println("10<<2 = " + (10 << 2));
        System.out.println("10>>2 = " + (10 >> 2));
        System.out.println("10>>>2 = " + (10 >>> 2));
        System.out.println("-----------------------");
        System.out.println("  -10  ");
        System.out.println("-10<<2 = " + (-10 << 2));
        System.out.println("-10>>2 = " + (-10 >> 2));
        System.out.println("-10>>>2 = " + (-10 >>> 2));
        System.out.println("Integer.MAX_VALUE:"+Integer.MAX_VALUE);
        System.out.println("1073741823 << 1 = "+ (1073741823 << 1));//1073741823        2      2147483646,   
        System.out.println("1073741824 << 1 = "+ (1073741824 << 1));//1073741823        2      2147483648,  
        
    }
}

計算結果:
  10  
10<<2 = 40
10>>2 = 2
10>>>2 = 2
-----------------------
  -10  
-10<<2 = -40
-10>>2 = -3
-10>>>2 = 1073741821
Integer.MAX_VALUE:2147483647
1073741823 << 1 = 2147483646
1073741824 << 1 = -2147483648