• ベストアンサー

C言語で、2進数を扱うには。

C言語で、2進数を扱いたいのですが、 よく分かりません。 ためしに、 int a=2,int b=1 で、 int c=a | b printf("answer=%d"),c) とすると、3となります。 a & bだと、0です。 この場合、a,bは2進数変換されて、 計算され、表示は、10進数に 直されて、表示されているようです。 一方、 a=10,b=2とすると、 a | b=10 a & b=2です。 この場合、10は2進数に直されず (そのまま2進数扱い)、 2は2進数に直され、 表示は、a | bはそのまま2進数扱い、 a & bは、10進数に直されています。 (1、0だけだと、勝手に2進数扱い されてしまうのか、とも思うけれど)。 10進数と、2進数の使い分けかたなど、 何か分かりましたら、お願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • nagare
  • ベストアンサー率33% (280/831)
回答No.1

>a=10,b=2とすると、 >a | b=10 >a & b=2です。 >a=10,b=2とすると、 >a | b=10 >a & b=2です。 10って10進の10ですよね そうであれば答えは合ってますけど 10→1010 2→0010 orの結果 ⇒1010(10) andの結果⇒0010(2)

すると、全ての回答が全文表示されます。

その他の回答 (3)

回答No.4

C言語においては、一切の演算が二進数レベルで行なわれます。 プログラム上16進数,10進数,8進数どのような表現をしても、演算するときは二進数ですから、C言語プログラマーの皆さんは、デバック時に二進数レベルでものを考えますし、多くの書物も最終的には二進数による説明をします。 プログラミングが10進数であっても、コンパイル以降は二進数の世界になるのです。

すると、全ての回答が全文表示されます。
  • THX1138
  • ベストアンサー率51% (108/208)
回答No.3

どちらの例もまったく同じ操作であり 処理系の方で基数を作為的に「直す」ということはしていません。 int であれば内部表現は(大抵の計算機では)常に2進です。 また、| 演算子や & 演算子はビット単位の 演算をするものであって、「足し算」ではありませんので、 あくまでもビット単位の演算になります。 int a=2,int b=1 int c=a | b この例の場合 a -> 10 b -> 01 c -> 11 したがって表示は3になります a=10,b=2とすると、 a | b=10 a & b=2 この例では a -> 1010 b -> 0010 | -> 1010 & -> 0010 となり結果は上記のとおりです。 ではなんで a + b だと 12 になるかというと、 繰り上げをきちんと処理するからです。 a -> 1010 b -> 0010 + -> 1100 2桁目で繰り上げが発生しています。 +, - などの算術演算子は繰上げをきちんと扱います。 一方、| や & などのビット演算子は 単にビットごとの比較しかしないので、 このような結果になるのです。

すると、全ての回答が全文表示されます。
  • mac_res
  • ベストアンサー率36% (568/1571)
回答No.2

ビット演算は全て2進数として扱われています。 単に表示が10進数になっているだけです。 printf("answer=0x%x\n",c); として16進数で確認してみてください。

すると、全ての回答が全文表示されます。

関連するQ&A