シフト演算子 ビット演算子 - 萌えJava超入門
第六章 ビット演算子

シフト演算子

ビット演算子は値をビット単位の編集する演算です。
シフト演算子はビット単位で桁移動します。

<< >> >>>

これはまた
面妖な...。

目次

1.シフト演算子の種類


シフト演算子は以下の3種類です。
x と n は整数とします。
シフト演算子の種類
演算子記述例説明
<<x << nx を左に nビットシフト
>>x >> nx を符号を維持して右に nビットシフト
>>>x >>> nx を右に nビットシフト

言葉で説明するより
図で見てもらった方が早いだろう。


2.左シフト演算子


<<
例えば、
x = 01001100_01110011_001100011_1001101 << 3
を計算してみましょう。

左シフト << 演算子
シフト演算子 左シフト <<演算子

左シフトなので、値を左側に3ビットずらします。
左側にはみ出た3ビットは捨てられます。
右側にできた空白には、0を埋めます。


答えは、01100011_10011001_10001110_01101000 です。

シフトって
そうゆうこと?


3.右シフト演算子(符有)

>>

右シフト演算子は、右シフトによってできた左側の空白に0を埋める場合と1を埋める場合があります。
これは、シフトによる符号(+ -)の変化をさせない意図によるものです。


例えば、
x = 01001100_01110011_001100011_1001101 >> 3
を計算してみましょう。

右シフト演算子(符有)0埋め
右シフト演算子(符有)0埋め

右シフトなので、値を右側に3ビットずらします。
右側にはみ出た3ビットは捨てられます。

右側にできた空白には、シフト前に一番右のビットにあった値を埋めます。
x の一番右のビットが0だったので、空白には0を埋めます


答えは、00001001_10001110_01100110_00111001 です。




一番左のビットが1の場合も見てみましょう。
y = 11001100_01110011_001100011_1001101 >> 3
を計算してみましょう。

右シフト演算子(符有)1埋め
右シフト演算子(符有)1埋め

右シフトなので、値を右側に3ビットずらします。
右側にはみ出た3ビットは捨てられます。
x の一番右のビットが1だったので、空白には1を埋めます

答えは、11111001_10001110_01100110_00111001 です。



4.右シフト演算子(符無)


>>>
例えば、
x = 01001100_01110011_001100011_1001101 >>> 3
を計算してみましょう。

右シフト演算子(符無)
右シフト演算子(符無)

右シフトなので、値を左側に3ビットずらします。
左側にはみ出た3ビットは捨てられます。
右側にできた空白には、x の符号にかかわらず 0を埋めます


答えは、00001001_10001110_01100110_00111001 です。

ビットデータを左右に振って
はみださせてるんですね。



そう。
それだけだ。



で、
何に使えるのよ。
ビットデータの一部を
切り出す時に使うんだ。


5.プログラム例


上述の例題を実際のプログラムで確認してみましょう。
なお、2進数を用いたリテラルでは、「_」(アンダーライン)を無視するようになっています。
見やすいように右から4桁や8桁で区切るのが一般的です。

//Sample06_31.java
class Sample06_31 {
    public static void main(String[] args){
        int x = 0b01001100_01110011_00110001_11001101;
        int y = 0b11001100_01110011_00110001_11001101;
        int ans;
        String binStr;

        ans = x << 3;
        binStr = Integer.toBinaryString(ans);//2進数の文字列
        binStr = String.format("%32s", binStr);//32桁
        binStr = binStr.replace(' ', '0');//0埋め
        System.out.println(binStr);

        ans = x >> 3;
        binStr = Integer.toBinaryString(ans);
        binStr = String.format("%32s", binStr);
        binStr = binStr.replace(' ', '0');
        System.out.println(binStr);

        ans = y >> 3;
        binStr = Integer.toBinaryString(ans);
        binStr = String.format("%32s", binStr);
        binStr = binStr.replace(' ', '0');
        System.out.println(binStr);

        ans = x >>> 3;
        binStr = Integer.toBinaryString(ans);
        binStr = String.format("%32s", binStr);
        binStr = binStr.replace(' ', '0');
        System.out.println(binStr);
    }
}

コマンドライン
>javac Sample06_31.java
>java Sample06_31
01100011100110011000111001101000
00001001100011100110011000111001
11111001100011100110011000111001
00001001100011100110011000111001

ん~。
ちょっとイメージが
掴みづらいっス。
次のページで実例を挙げている。
そっちで説明しよう。


お疲れ様でした。




© 2019 awasekagami