第六章 ビット演算子
シフト演算子
ビット演算子は値をビット単位の編集する演算です。
シフト演算子はビット単位で桁移動します。
<< >> >>>
これはまた
面妖な...。
目次
1.シフト演算子の種類
シフト演算子は以下の3種類です。
シフト演算子の種類
| 演算子 | 記述例 | 説明 |
| << | x << n | x を左に nビットシフト |
| >> | x >> n | x を符号を維持して右に nビットシフト |
| >>> | x >>> n | x を右に 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埋め
右シフトなので、値を右側に3ビットずらします。
右側にはみ出た3ビットは捨てられます。
右側にできた空白には、シフト前に一番右のビットにあった値を埋めます。
x の一番右のビットが0だったので、空白には0を埋めます。
答えは、00001001_10001110_01100110_00111001 です。
一番左のビットが1の場合も見てみましょう。
y = 11001100_01110011_001100011_1001101 >> 3
を計算してみましょう。
右シフト演算子(符有)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
ん~。
ちょっとイメージが
掴みづらいっス。
次のページで実例を挙げている。
そっちで説明しよう。
お疲れ様でした。