intの2進数表現 ビット演算子 - 萌えJava超入門
第六章 ビット演算子

intの2進数表現

intは、4つの8ビットデータをパックした値として使用できます。
この際ビット演算子が活躍します。

目次

1. 2進数の復習


2進数は、数値を 0 と 1 で表す表現方法です。
パソコンの中では、値を2進数で処理していますが、人間にはなじまないところがあります。
しかし、敢えてメモリの直接的な操作をするために2進数を使うことがあります。

2進数の0埋め
10進数     2進数(8bit)
----------------------
 0   -->   0000 0000
 1   -->   0000 0001
 2   -->   0000 0010
 3   -->   0000 0011
 4   -->   0000 0100
 5   -->   0000 0101
 6   -->   0000 0110
 7   -->   0000 0111
 .   -->     .
 .   -->     .
 .   -->     .
 .   -->     .
 254 -->   1111 1110
 255 -->   1111 1111




2. intのビット列


intは10進数で表現すると -2147483648 ~ 2147483647 の範囲ですが、
メモリのサイズが、4byte = 32bit なので、32桁のビット列とみることもできます。
例えば、10進数の 255 を2進数で表現すると、11111111 ですが、
intのビット列として表現すると、
00000000_00000000_00000000_11111111
となります。(見やすいように8桁ごとに「_」(アンダーライン)を入れています。)
ビット演算を行う場合には、32桁のすべてのビットに対して演算を行うので、
0 も無視できません。ご注意ください。

このプログラムは
2進数を表示したかっただけだ。
結果だけ見てほしい。
//Sample06_01.java
class Sample06_01 {
    public static void main(String[] args){

        int[] array   = {
          -2147483648,
          -16777216,
          -16776961,
          -16711936,
          -16711681,
          -65536,
          -65281,
          -256,
          -1,
          0,
          1,
          2,
          3,
          4,
          5,
          6,
          7,
          15,
          255,
          65280,
          65535,
          16711680,
          16711935,
          16776960,
          16777215,
          2147483647
        };

        System.out.println("");
        System.out.println("     12345678123456781234567812345678");
        System.out.println("-------------------------------------");

        String binStr;
        String hexStr;

        for(int i=0; i<array.length; i++){
          binStr = Integer.toBinaryString(array[i]);//2進数化
          binStr = String.format("%32s", binStr);//32桁
          binStr = binStr.replace(' ', '0');//0埋め
          System.out.println("bin: "+ binStr + " dec: " + array[i]);
        }
    }
}

コマンドライン
>javac Sample06_01.java
>java Sample06_01

     12345678123456781234567812345678
--------------------------------------------------------
bin: 10000000000000000000000000000000 dec: -2147483648
bin: 11111111000000000000000000000000 dec: -16777216
bin: 11111111000000000000000011111111 dec: -16776961
bin: 11111111000000001111111100000000 dec: -16711936
bin: 11111111000000001111111111111111 dec: -16711681
bin: 11111111111111110000000000000000 dec: -65536
bin: 11111111111111110000000011111111 dec: -65281
bin: 11111111111111111111111100000000 dec: -256
bin: 11111111111111111111111111111111 dec: -1
bin: 00000000000000000000000000000000 dec: 0
bin: 00000000000000000000000000000001 dec: 1
bin: 00000000000000000000000000000010 dec: 2
bin: 00000000000000000000000000000011 dec: 3
bin: 00000000000000000000000000000100 dec: 4
bin: 00000000000000000000000000000101 dec: 5
bin: 00000000000000000000000000000110 dec: 6
bin: 00000000000000000000000000000111 dec: 7
bin: 00000000000000000000000000001111 dec: 15
bin: 00000000000000000000000011111111 dec: 255
bin: 00000000000000001111111100000000 dec: 65280
bin: 00000000000000001111111111111111 dec: 65535
bin: 00000000111111110000000000000000 dec: 16711680
bin: 00000000111111110000000011111111 dec: 16711935
bin: 00000000111111111111111100000000 dec: 16776960
bin: 00000000111111111111111111111111 dec: 16777215
bin: 01111111111111111111111111111111 dec: 2147483647

intを32桁のビット列としてみると、10進数とは違った使い道がありそうですね。
実際には、画像データの1ピクセルに含まれる色データ(ARGB)や、
IPアドレス(192.168.0.1)のように、
4つの8ビットデータをパックした値として使用されます。



intのメモリ領域を
ビット単位で操作するんだ。
1ビット=メモリセル1個だな。
おお?!
1970年代のコンピュータ!
って感じね!
ちなみにビット演算の様に
ハードウェアに近い処理のことを
「低水準な処理」という言い方をするぞ。


お疲れ様でした。



© 2019 awasekagami