- ベストアンサー
c言語、演算子&について
当方c言語、初心者でただいま勉強中です。 以下のようなプログラムをコンパイルし実行すると、 i=10,j=2というように表示されます。 この場合の&は論理積と理解してよいのでしょうか? そうだとすると&の後の-10はどのように理解すればよいのでしょうか? ご存じの方いらっしゃれば教えていただけないでしょうか? #include <stdio.h> int main(void) { int i,j; i=10; j=i&-10; printf("i=%d,j=%d",i,j); return 0; }
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
>&の後の-10はどのように理解すればよいのでしょうか? (intを16bitとします) 「10」は16進数で「000A」、「-10」は16進数で「FFF6」となります。 従って「0000 0000 0000 1010」と「1111 1111 1111 0110」 の論理積を取ることになり、結果は「2」となります。
その他の回答 (5)
- osamuy
- ベストアンサー率42% (1231/2878)
ある整数値とその数のマイナスにしたものとのビット積は、1の桁からみて最初にビットが1となる数を表す――という小技を示すプログラムかも。 例)10=0b1010だと最初に1がたつ値は2=0b10。 100=0b1100100だと、4=0b100。 それぞれのビットが何らかの条件を表してるとき、条件成立しているものを(ひとつだけ)一発で取り出すのに使えるという。
お礼
御回答ありがとうございますm(_ _)m なるほど~そういう使い方もできますね(゜Д゜) 何となくロボットとかで使えそうですね。 ありがとうございました。
- jacta
- ベストアンサー率26% (845/3158)
> &の後の-10はどのように理解すればよいのでしょうか? どのようにも何も、int型の整数定数であり、&演算子の右オペランドです。 なお、符号付き整数型をオペランドとするビット単位の演算子の結果は処理系定義です。
お礼
御回答ありがとうございますm(_ _)m かなり初歩的な質問だったようですね(^^;) 勉強不足でした。 ありがとうございました。
- Tacosan
- ベストアンサー率23% (3656/15482)
「&」はビット演算子です. 論理演算子「&&」とは区別してください. -2 は「false」ではありませんよ>#3.
お礼
御回答ありがとうございますm(_ _)m ふ~む、ビット演算子と論理演算子に区別があったのですね~(^^;) ありがとうございました。
- 1108435
- ベストアンサー率43% (94/217)
基本的に間違いのプログラムですから、考えないほうが良いとは思いますけどね。 &は確かに論理積を求める演算子ですから式中にある j = i & -10;(変数と演算子の間にスペースを入れるとソースが見やすくなります) の結果になりますから、jはiと-10の値の論理積の結果ということになりますね。 もちろんこのときjの宣言を論理型にしておけばjはfalseになると思います。
お礼
御回答ありがとうございますm(_ _)m 実はこれ私が書いたプログラムなんです。 お恥ずかしい限りです(^^;) ソースの書き方など勉強になりました。 ありがとうございました。
- D-Matsu
- ベストアンサー率45% (1080/2394)
&は「ビット論理積」です。 ビット演算に関する知識がないと説明がやや面倒なのですが、 iは10ですから2進表記(8桁)で00001010、-10は11110110となります。 これを各桁でANDを取っていくと、 00001010 11110110 -------- 00000010 となります。 普通は10進表記で「-10」なんて書かずに、基数変換しやすい16進表記で「0xFFF6」とか書くんですけどね……
お礼
御回答ありがとうございますm(_ _)m 今後は基数変換しやすい表記を用いることにします(^_^)/ ありがとうございました。
お礼
御回答ありがとうございますm(_ _)m なるほど~16進数はマイナス表現ができるのですね。 知りませんでした(^^;) おかけで理解できました。 ありがとうございました。