PHASE2 LOG

主にIT関連・ゲームのログ

Javaのお勉強~ビット演算~

      2016/04/13

コンピュータ関連の基礎で学ぶビット演算についてお勉強します。

 

ビットとは

 

ビットとはコンピュータで扱う最小の情報量の単位です。

1ビットで2進数の1桁に相当します。

 

よくコンピュータは「0」と「1」の世界と言われる由縁でもありますね。

 

また、バイトという単位もありますがこれは1ビットを8個集めたものなので

1バイト=8ビットというようになります。

 

ビット演算子

 

ビットの比較や操作を行う際に使用するのがビット演算子です。

複数のビット演算子があるので1つずつまとめてみます。

 

1.論理積 AND

ビットを比較して両方とも1なら1を、そうでなければ0を返します。

test1 = 101010

test2 = 111111

test1 &test2 = 101010

 

2.論理和 OR

ビットを比較して片方でも1であれば1を、そうでなければ0を返します。

test1 = 101010

test2 = 111111

test1 | test2 = 111111

 

3.排他的論理和 XOR

ビットを比較して片方が1であれば1、そうでなければ0を返します。

test1 = 101010

test2 = 111111

test1 | test2 = 010101

4.1の補数 NOT

ビットを反転させたもの(1であれば0,0であれば1)を返します。

test1 = 101010

~test1 = 010101

補数とは足して桁上りする数のことを指す。

 

それでは実際の例を見てみましょう。

public class BitTest {
	public static void main(String[] args){
		byte test1 = 42;	//2進数で101010
		byte test2 =  63; //2進数で111111
		
		//論理積and -> 101010なので42を出力
		System.out.println("and:" + (test1 & test2));
		
		//論理和or -> 111111なので63を出力
		System.out.println("or:" + (test1 | test2));
				
		//排他的論理和or -> 010101なので21を出力
		System.out.println("xor:" + (test1 ^ test2));
		
		//1の補数表現(ビット反転)-> 11000000なので-43を出力
		System.out.println("test1:" + ~test1);
		
		//1の補数表現(ビット反転)-> 000000なので-64を出力
		System.out.println("test2:" + ~test2);
	}
	
}

 

各演算子の説明に合わせてtest1 = 101010(10進数では42)とtest2 = 111111(10進数では63)で

例を作ってみました。

 

最初に引っかかったのは2進数に変換すべきなのでは?と考えておりましたが、

どうやらJava(というよりプログラミング言語かな)は10進数で書いたつもりでも

2進数で計算されるようです。

…まぁそのためにコンパイルしてるんでしょうね(笑)

 

これがわかっていれば論理積、論理和、排他的論理和は簡単に理解できると思います!

 

次に引っかかったのが1の補数表現。

test1 = 101010だからビット反転すると「010101」で答えは10進数の21になると思ってました。

でも実際に出力されたのは負の数である「-43」。

 

byte型でtest1に10進数の42を定義しておりますが、これは「101010」だとおもいきや、

実は「00101010」の8桁だったわけです。

そういえば1バイトは8ビットなので前の方に0が隠れているのですね。。

 

なのでビット反転すると「11010101」となり、10進数で「-43」が出力されます。

 

上記のソースの実行結果は以下となります。

and:42

or:63

xor:21

test1:-43

test2:-64

 

うーん…基本情報の本も読み直さないとなかなか覚えてないものです(;´∀`)

 

人気ブログランキング

 -