- - PR -
int型の数字を二進数変換してbyte配列に変換したい
1|2|3
次のページへ»
| 投稿者 | 投稿内容 | ||||
|---|---|---|---|---|---|
|
投稿日時: 2005-05-22 11:26
いつもお世話になります。
例として十進数で「259」という数字があるとします。 これは二進数に変換すると 0000001100000001 です。 これを8ビットで区切ると 00000011と00000001になると思います。 これで、byte[] b = { 3 , 1 } に変換したいのです。 つまり 「int型の数字を二進数変換してbyte配列に変換したい」 のです。 どうすればいいでしょうか? 参考になるページなどありましたら御教授いただけないでしょうか? まったくつまらない質問かもしれませんが、Javaからプログラミング言語を始めましたので、こういったビット演算には弱いのです。 よろしくお願いします。 | ||||
|
投稿日時: 2005-05-22 11:41
使ったことはありませんが、
IntegerクラスのtoBinaryString()を使えば、2進数への変換はできそうですよ。 java.lang.IntegerのtoBinaryString()ソースコードを見れば、Stringにしない変換方法も分かると思いますよ。 | ||||
|
投稿日時: 2005-05-22 11:43
[ メッセージ編集済み 編集者: Kissinger 編集日時 2005-05-22 11:43 ] | ||||
|
投稿日時: 2005-05-22 14:57
java.io.DataOutputStream#writeInt(int v) が
ほぼそのままの処理をしていますので、このソースコードを参考すると良いかと。 | ||||
|
投稿日時: 2005-05-22 16:23
みなさん、早速の返信ありがとうございます。
DataOutputStream$writeInt(int)を参考にコードを作成しました。
ありがとうございました。 | ||||
|
投稿日時: 2005-05-22 19:57
何でわざわざ算術シフトした後にマスクしてるんでしょうかね。
| ||||
|
投稿日時: 2005-05-22 23:40
DataOutputStream$writeInt(int)のコードを見るとマスクしていたのですが、ataOutputStream$writeLong(int)はマスクしていませんでした。(機能的には同じだと思うのですが・・・。)
わざわざマスクしているので、あえて外さずにつけておきました。 | ||||
|
投稿日時: 2005-05-23 00:55
どもです。がると申します。
マスクの話で一言だけ、と思いまして。 まず前提ですが「無くても問題ない」というのは真です。 例題として
を取り上げてみます。 例えばiが0xffeeddccであった場合。 シフト演算によって、データは0xffeeとなります。 で、byteは「8bitのデータを格納する」とされているために 上位8bitのff部分が切り捨てられて0xeeが格納されます。 このあたりからわかるとおり、0xffとのand演算(マスク)が なくても問題なく動く、というのは真です。 ただし。上記は「byteが8bitである」という仕様がきちんと 守られ、かつそれが永続的に変化しない場合、になります。 んでもって、仕様が「永続的である」保障はどこにもありません。 そういった点から考えると、マスクをしないというのは、 速度的には好ましい反面、「byteは8bitであり、それを超える 値を入れたときには上位ビットは切り捨てられるであろう」という、 仕様への期待を込めたコードであると言えます。 言い方を変えると「仕様が変わるという"外部要因"によって コードの挙動が変化しうる」、危険なコードであるともいえます。 そこから考えると、厳密な(あるいはより安全な)コードを 書くことを基準にした場合、マスクしたほうが「よりよい」コード である、という見方も出来るかと思います。 ひろひろさんのプログラムがどのような性質かわからないのでなんとも、 ではあるのですが(速度を求めるか、等)。 まぁこんな考え方もあるんだなぁくらいに見ていただければと思います :-P | ||||
1|2|3
次のページへ»
