ビットで表示しましょう。 - いまさらながらですが。
2007/08/21
java
ビット
画像処理
いまさらながら感がさらに漂いますが、javaでビット表示です。
Integer.toBinaryString
であればこれで変換します。
System.out.println(Integer.toBinaryString(Integer.MAX_VALUE));
とすれば、
1111111111111111111111111111111
と表示されます。
次に0埋め、桁あわせですが、String.formatterが使えるかなぁと思ったんですけど、ちょっとうまくできなくて...
しかたがないので、
public static void p(String s) {
StringBuilder builder = new StringBuilder();
for (int i = s.length(); i < 32; i++) {
builder.append('0');
}
builder.append(s);
System.out.println(builder);
}
StringBuilder builder = new StringBuilder();
for (int i = s.length(); i < 32; i++) {
builder.append('0');
}
builder.append(s);
System.out.println(builder);
}
とかなんとかします。
ついでに、
public static String toBin(int i) {
return Integer.toBinaryString(i);
}
return Integer.toBinaryString(i);
}
を用意しておきます。
これで、準備はできたので、
使ってみます。
p(toBin(Integer.MAX_VALUE));
p(toBin(Integer.MIN_VALUE));
p(toBin(-1));
p(toBin(max >> 16));
p(toBin(max >> 8));
p(toBin(max >> 4));
結果は、
01111111111111111111111111111111
10000000000000000000000000000000
11111111111111111111111111111111
00000000000000000111111111111111
00000000011111111111111111111111
00000111111111111111111111111111
となります。
javaのintは32bitで符号付なので、一番左側は符号をあらわしていますね。
全てのビットをたてたい場合は-1ということになるのかな。
ビットをみることができるようになると、ビットの動きがみえるようになると演算子の理解がすすむかと思いましたよ。
javaでは色を表現するのにRGBの値をint(32ビット)で一般的に使用しています。
ではRGBの各成分を取得することを考えてみます。
とりあえず0xffffffffにした値からRGBの成分をとってみます。
下記のようなコードにしてみました。
int i = 0xffffffff;
p(toBin((i & 0xff0000)) );// R成分
p(toBin((i & 0xff00)) );// G成分
p(toBin((i & 0xff)) );// B成分
p(toBin((i & 0xff0000)) );// R成分
p(toBin((i & 0xff00)) );// G成分
p(toBin((i & 0xff)) );// B成分
結果
00000000111111110000000000000000
00000000000000001111111100000000
00000000000000000000000011111111
ちなみに一番左側8バイトはアルファチャンネル(透明度)をあらわしているようです。
p(toBin(0xff000000));
p(toBin(0xff0000));
p(toBin(0xff00));
p(toBin(0xff));
p(toBin(0xff0000));
p(toBin(0xff00));
p(toBin(0xff));
としますと結果は、
11111111000000000000000000000000
00000000111111110000000000000000
00000000000000001111111100000000
00000000000000000000000011111111
です。
うーん、やって思ったのはどうも、0xXXXXXXXXの使い方が自分の直感とそぐわないんですよね。なんでかなぁ。
それで、下記のようにしてみると自分の直感とマッチ
p(toBin(0xff000000));
p(toBin(0x00ff0000));
p(toBin(0x0000ff00));
p(toBin(0x000000ff));
p(toBin(0x00ff0000));
p(toBin(0x0000ff00));
p(toBin(0x000000ff));
結果は、
11111111000000000000000000000000
00000000111111110000000000000000
00000000000000001111111100000000
00000000000000000000000011111111
ようするに桁があってる感じがすると自分の脳とダイレクトな感じがするからですかね。
: