カテゴリー
未分類

16進数演算

icon_flash8.jpgこれなんかものすごく初歩的なミスかもしれないのですが、はまり中。

a = 0xeeeeeeee;
b = a/2;
trace([b, b.toString(16)]);
b = Math.round(b);
trace([b, b.toString(16)]);
[output]
2004318071,77777777
2004318071,77777777

特になし。で、端数がでるものをMath.roundで丸めてみる

a = 0xffffffff;
b = a/2;
trace([b, b.toString(16)]);
b = Math.round(b);
trace([b, b.toString(16)]);
[output]
2147483647.5,7fffffff
2147483648,-(0000000

丸めないのはまぁ予想通り。余計な親切心で丸めた結果のものは-(0000000となった。えーっとこれは何だろう?0x80000000だと思ったりしたんだけど、何故に“(“なのだろう?なんか基本的な16進数の考え方が間違っているのだろうか?が回らない・・・・。


ついでにもう一つ念のため、他に端数の出る除算

a = 0x77777777;
b = a/2;
trace([typeof (b), b, b.toString(16)]);
b = Math.round(b);
trace([typeof (b), b, b.toString(16)]);
[output]
number,1002159035.5,3bbbbbbb
number,1002159036,3bbbbbbc

特におかしくないよなぁ・・・(;´Д`)

「16進数演算」への4件の返信

丸めとは関係なく、単純に int 型の最大値が2147483647なので
最上位ビットが符号ビットとして使われているだけだと思います。
ということは、アルファ情報は128階調になっちゃうのかな・・・

なるほど、そういうことですか・・
>int 型の最大値が2147483647
これが全然記憶に引っかかりませんでした・・・(;´Д`)
ということは0x7fffffffが上限になるのかしら?

intに上限あるならば、
HI、LOWと二つのint型変数をつくって、上位、下位をまたぐ計算ルーチンを作るってのはどうでしょう?
4bitとか8bitのマイコンではよく使ってました、こういう技。
めんどくさいですけど・・・

>4bitとか8bitのマイコンではよく使ってました、こういう技。
そ・・そうなのですかー。
プログラムって難しいなぁ・・・・・。勉強しなくては

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です