- PR -

int型の数字を二進数変換してbyte配列に変換したい

投稿者投稿内容
ひろひろ
常連さん
会議室デビュー日: 2004/07/23
投稿数: 36
投稿日時: 2005-05-22 11:26
いつもお世話になります。

例として十進数で「259」という数字があるとします。
これは二進数に変換すると
0000001100000001
です。

これを8ビットで区切ると
00000011と00000001になると思います。

これで、byte[] b = { 3 , 1 }
に変換したいのです。

つまり
「int型の数字を二進数変換してbyte配列に変換したい」
のです。

どうすればいいでしょうか?
参考になるページなどありましたら御教授いただけないでしょうか?

まったくつまらない質問かもしれませんが、Javaからプログラミング言語を始めましたので、こういったビット演算には弱いのです。

よろしくお願いします。
nekoyama
ベテラン
会議室デビュー日: 2005/03/12
投稿数: 71
投稿日時: 2005-05-22 11:41
使ったことはありませんが、
IntegerクラスのtoBinaryString()を使えば、2進数への変換はできそうですよ。
java.lang.IntegerのtoBinaryString()ソースコードを見れば、Stringにしない変換方法も分かると思いますよ。
Kissinger
ぬし
会議室デビュー日: 2002/04/30
投稿数: 428
お住まい・勤務地: 愛知県
投稿日時: 2005-05-22 11:43
コード:

byte[] b = {(byte)259, (byte)(259 >> 8)};



[ メッセージ編集済み 編集者: Kissinger 編集日時 2005-05-22 11:43 ]
ちいにぃ
大ベテラン
会議室デビュー日: 2002/05/28
投稿数: 244
投稿日時: 2005-05-22 14:57
java.io.DataOutputStream#writeInt(int v) が
ほぼそのままの処理をしていますので、このソースコードを参考すると良いかと。
ひろひろ
常連さん
会議室デビュー日: 2004/07/23
投稿数: 36
投稿日時: 2005-05-22 16:23
みなさん、早速の返信ありがとうございます。
DataOutputStream$writeInt(int)を参考にコードを作成しました。

コード:
    static byte[] chgBytes( int i ){
        byte[] b = new byte[4] ;
        
        b[0] = (byte)((i >>> 24 ) & 0xFF);
        b[1] = (byte)((i >>> 16 ) & 0xFF);
        b[2] = (byte)((i >>>  8 ) & 0xFF);
        b[3] = (byte)((i >>>  0 ) & 0xFF);
        
        return b;
    }



ありがとうございました。
Anthyhime
ぬし
会議室デビュー日: 2002/09/10
投稿数: 437
投稿日時: 2005-05-22 19:57
何でわざわざ算術シフトした後にマスクしてるんでしょうかね。
ひろひろ
常連さん
会議室デビュー日: 2004/07/23
投稿数: 36
投稿日時: 2005-05-22 23:40
DataOutputStream$writeInt(int)のコードを見るとマスクしていたのですが、ataOutputStream$writeLong(int)はマスクしていませんでした。(機能的には同じだと思うのですが・・・。)
わざわざマスクしているので、あえて外さずにつけておきました。
がるがる
ぬし
会議室デビュー日: 2002/04/12
投稿数: 873
投稿日時: 2005-05-23 00:55
どもです。がると申します。
マスクの話で一言だけ、と思いまして。

まず前提ですが「無くても問題ない」というのは真です。
例題として
コード:
b[1] = (byte)((i >>> 16 ) & 0xFF);


を取り上げてみます。
例えばiが0xffeeddccであった場合。
シフト演算によって、データは0xffeeとなります。
で、byteは「8bitのデータを格納する」とされているために
上位8bitのff部分が切り捨てられて0xeeが格納されます。
このあたりからわかるとおり、0xffとのand演算(マスク)が
なくても問題なく動く、というのは真です。

ただし。上記は「byteが8bitである」という仕様がきちんと
守られ、かつそれが永続的に変化しない場合、になります。
んでもって、仕様が「永続的である」保障はどこにもありません。

そういった点から考えると、マスクをしないというのは、
速度的には好ましい反面、「byteは8bitであり、それを超える
値を入れたときには上位ビットは切り捨てられるであろう」という、
仕様への期待を込めたコードであると言えます。
言い方を変えると「仕様が変わるという"外部要因"によって
コードの挙動が変化しうる」、危険なコードであるともいえます。

そこから考えると、厳密な(あるいはより安全な)コードを
書くことを基準にした場合、マスクしたほうが「よりよい」コード
である、という見方も出来るかと思います。

ひろひろさんのプログラムがどのような性質かわからないのでなんとも、
ではあるのですが(速度を求めるか、等)。
まぁこんな考え方もあるんだなぁくらいに見ていただければと思います :-P

スキルアップ/キャリアアップ(JOB@IT)