ゆるゆるプログラミング

・ビットシフト

ビットシフト(bit)とは、2進数を表現するビット(0と1の2つの値)の桁を左右のどちらかに指定回数だけずらすことです。ビットシフトには、右にビットの並びをずらす右シフトと、左にずらす左シフトがあります。

①右シフト

 すべてのビットを右にずらします。演算子は、">>"です。

 下図は、bytet型(8bit)の78を右にシフトしている様子を表したものです。1回のシフトで最上位ビット(左端のビット)は必ず0になります。また、シフト前の最下位ビット(右端のビット)は、無くなります。

 条件によって、1回の右シフトには2で割るのと同じ計算になります。2で割ったときの余りは切り捨てです。ここでの条件は、計算する値が整数型で、正の整数であることです。

AND

②左シフト

 すべてのビットを左にずらします。演算子は、"<<"です。

 下図は、bytet型(8bit)の78を左にシフトしている様子を表したものです。1回のシフトで最下ビット(右端のビット)は必ず0になります。また、シフト前の最上位ビット(左端のビット)は、無くなります。

 条件によって、1回の左シフトには2を掛けるのと同じ計算になります。ここでの条件は、計算する値が整数型で、正の整数であることです。 ただし、最上位ビットが1の場合にマイナスの値になるので、シフトの回数が多いとマイナスの値になってしまいます。

OR

これを、Javaのソースコードにすると以下のようになります。

BitOperator.java
001:    public class BitOperator {
002:    	public static void main( String[] args ) {
003:    		int a = 14;	// 2進数 1110
004:    		int b = 5;	// 2進数 0101
005:    
006:    		int and = a & b; // AND
007:    		int or  = a | b; // OR
008:    		int xor = a ^ b; // XOR
009:    		int not = ~a;    // NOT
010:    
011:    		//結果を表示
012:    		System.out.println( a + " AND " + b + " = " + and );
013:    		System.out.println( a + " OR  " + b + " = " + or );
014:    		System.out.println( a + " XOR " + b + " = " + xor );
015:    		System.out.println( "NOT " + a + " = " + not );
016:    	}
017:    }

出力結果

14 AND 5 = 4
14 OR  5 = 15
14 XOR 5 = 11
NOT 14 = -15

ここからは、このソースコードを上から順番に解説していきます。

001:    public class BitOperator {

クラス名を、BitOperatorとしています。

002:    	public static void main( String[] args ) {

このmainメソッドからプログラムを実行します。

003:    		int a = 14;	// 2進数 1110
004:    		int b = 5;	// 2進数 0101

このプログラムで演算に使うint型変数aとbを宣言し、値を代入しています。

006:    		int and = a & b; // AND
007:    		int or  = a | b; // OR
008:    		int xor = a ^ b; // XOR

変数aとbをANDORXORで演算しています。

009:    		int not = ~a;    // NOT

変数aをNOT演算子で、ビットを反転しています。

011:    		//結果を表示
012:    		System.out.println( a + " AND " + b + " = " + and );
013:    		System.out.println( a + " OR  " + b + " = " + or );
014:    		System.out.println( a + " XOR " + b + " = " + xor );
015:    		System.out.println( "NOT " + a + " = " + not );

最後に演算結果を表示しています。

■関連コンテンツ

2進数 2進数について
変数について Javaで扱う変数について解説

■新着情報

2017.11.17 N値化 カラー画像をN値化する方法について解説
2017.11.16 最も近い値の取得 指定値に最も近い配列の値を取得する方法を解説
2017.10.02 アルファ値(透過) アルファ値(透過)について

■広告

法人向けのETC専用カード

~約8,000名の受講生と80社以上の導入実績~ 企業向けプログラミング研修ならCodeCamp

日本最大級ショッピングサイト!お買い物なら楽天市場

Topへ