すべてのカテゴリ » インターネット・パソコン » 技術・プログラミング

質問

終了

ビット演算がよくわかりません。
Javaプログラムを書いていて、0x01や0x00の表記を見かけるのですがどのような意味なのでしょうか?

  • 質問者:無知人
  • 質問日時:2008-12-18 16:56:44
  • 1

0xは16進数表記です。(0x0F=15です)
たとえば0x0Aと0x02のANDを取れば0x02になります
2進表記
0000 1010 and 0000 0010 = 0000 0010

個人的には私のようにアセンブラ使いにとっては16進表記が非常にイメージしやすいので良いと思いますが、Java使いの方にとってはどうなんでしょうか・・・?

===補足===
16進数=hexadecimalからxを取っていると思いますが、そこまで考えたことが無いので本当かどうかはわかりません。C系言語は0xと書きますが0hと書く言語もあります
ちなみに古いC言語では0b・・・・と書くと2進数(Binnaly)ですので、多分あってると思うのですが・・・。

  • 回答者:10進で考えてちゃ駄目よ (質問から8分後)
  • 0
この回答の満足度
  
とても参考になり、非常に満足しました。回答ありがとうございました。
お礼コメント

返答ありがとうございます。
16進数ですか・・・・なるほど。
0xってどのような意味なんでしょうか?

並び替え:

0x00とかは16進数ですね。

普通の数字は0〜9までの10種類の数字を使って表すので10進数ですが、
コンピュータの世界では0〜9、A〜Fまでの16種類を使った16真数がよく使われます。
また、0と1だけを使う2進数も知識として必要です。
それぞれの関係は以下の様になります。

10進数 16進数 2進数
 0    0   0
 1    1   1
 2    2   10
 3    3   11
 15    F   1111
 16   10   10000
 17   11   10001
 18   12   10010 

ビット演算ですが、&(AND)、|(OR)、~(NOT)、^(XOR)があります。
これらは、2進数に直して考えると簡単です。
char型を使用したとして、NOTを行うと、ビットが反転します。
~17の場合、
17(10進数) -> 00010001(2進数)
ビットを反転すると、11101110(2進数)になり、これを10進数に直すと、
238になります。

ANDでは、2つの値の桁毎にANDをとります。
15 & 6の場合、
15(10進数) -> 00001111(2進数)
6(10進数) -> 00000110(2進数)
で、0000110(2進数)になり、
6になります。

ORでは、2つの各桁毎にORをとります。
17 & 6の場合、
17(10進数) -> 00010001(2進数)
6(10進数) -> 00000110(2進数)
で、00010111(2進数)になり、
23になります。

  • 回答者:Maku (質問から52分後)
  • 0
この回答の満足度
  
とても参考になり、非常に満足しました。回答ありがとうございました。
お礼コメント

丁寧な回答ありがとうございました

http://ja.wikipedia.org/wiki/16%E9%80%B2%E6%95%B0
# ウィキペディア

>0xってどのような意味なんでしょうか?
↑を読めば分りますが、引用しておくと、

------------------------- ここから ----------------------
上記の数字に付く h や x は英語で十六進法を意味する hexadecimal から取ったものである。十六進数であることを明示し、b (二進数)、o (八進数)、d (十進数) などと区別するために用いる。
------------------------- ここまで ----------------------

です。

ビット演算は、ビット単位でフラグを立ててたり、符号のある数値を扱う時などに、アセンブラや初期のCで使ったりしてましたが、今の高級言語では、殆ど使われてないでしょうね。
コンパイラで、アセンブラリストを出力して、じっくり眺めてみるのもいいかも。。

この回答の満足度
  
とても参考になり、非常に満足しました。回答ありがとうございました。
お礼コメント

ありがとうございました

0x01は16進数で1を表現したもので、0x00は16進数で0を表現したものです。
"0x"と頭に書くと"16進数で"という意味になります。
"0x0A"は"16進数で0A"という意味になります。
("16進数で0A"は、10進数だと"10"です。)

私の経験上、Javaでビット演算やシフト演算を必要とする場面に出会った事がありません。
(以前、C言語出身のプログラマがJavaでビット演算をしてて驚いた事がありますが。)
何か特殊なプログラムなのでしょうか?

===補足===
完全にC言語育ちの人のソースですね。
Javaの場合、フラグはboolean型のtrue/falseを使うのが常識です。

  • 回答者:匿名希望 (質問から21分後)
  • 0
この回答の満足度
  
とても参考になり、非常に満足しました。回答ありがとうございました。
お礼コメント

よくわかりました。ありがとうございました。
フラグとして利用している変数にbyte型で0x00とか0x01が入っていました。。。。

関連する質問・相談

Sooda!からのお知らせ

一覧を見る