- ベストアンサー
C言語のビット演算子に関して
はじめまして、今C言語の学習(半月ほど)を行っている者ですが ビット演算子のところで悩んでおります。 問題文に 変数cの2ビット目と3ビット目をONにする、 あるいはOFFにするといった表記がでてくるのですが このON、OFFとは何を意味しているのかいっこうにわかりません。 (私の考えではONとは1を意味しており2ビット目、3ビット目を ONにするとは -------------------------------------------------------------- ~1|1|0|0 (右から0ビット目、1ビット目、2ビット目、3ビット目) -------------------------------------------------------------- ということを言っているのではないだろうかと思っています。) ビットに関して私の勉強不足であることは十分に認識して おりますが、何かヒントをいただけるとありがたく思っています。 宜しくお願いいたします。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
>ちなみに >問)int aとして変数aの2ビット目と3ビット目をONにする。 >解) a = a | 0x000C; >となってました。ここでいう0x000Cとは >0000 0000 0000 1100 >のことを言っていると解釈すればいいのですね。 質問本文、上記引用の「お礼」文、ともに質問者様の理解は正しく、 >勉強不足であることは十分に認識しております・・ とても謙虚な方ですね。 >ヒントをいただけると・・ とのこと、質問の事項は、 ★「ビット論理和」といいます。他にビットに関し「論理積」、「排他的論理和」があります。 ビット論理和の式の値は、〈整数式1〉と〈整数式2〉のどちらかで1であるビットを1に、他のビットをすべて0にした整数値です。 単純に、どこどこのビットを1にしたいからと、相当するビットに1を「足して」しまうと、たまたま元のビットが0ならばいいのですが、1ならば「繰り上げ」が起こってしまいます。「論理和」には「繰り上げ」は発生しません。 (No2さんへ) >10000001001100000 >0 ---> 000 >6 ---> 100 >2 ---> 001 年寄りの目には文字が小さく、思わずエディタにペーストして見ましたが、2進数表記1桁多すぎですよね、まっそれはいいとして、 1000001001100000 だから 1000 0010 0110 0000 で「左」から 8 ---> 1000 2 ---> 0010 6 ---> 0110 0 ---> 0000 でないと質問者様が混乱しちゃう・・・なんで2進3桁かとかも。 >普通は、下桁から意識するもんです。 そうか、だから「変数cの2ビット目と3ビット目をONにする」で通用しちゃうんだ(私は、本によりマチマチだから、その都度「どっちからだ?」と確認してたけど・・・)。
その他の回答 (4)
問いは、「仮定としてビット位置0は右端で、nとpは意味のある正の値とする」の通りです。 [イミディエイト] ? 0 or 1 1 ? 0 and 1 0 エクセルでの模擬テストです。 この結果を考えると納得がいくと思います。
お礼
なるほど、なんとなくイメージができました。 何度もご回答いただきありがとうございました。
補足: >右から0ビット目、1ビット目、2ビット目、3ビット目 これが、昔からの数え方。 私が言いたいのは、0ビット位置と書くか、但し書きがあってしかるべきということです。
お礼
ご回答ありがとうございました。 ビットに関してはもっとじっくり学習していきたいと 思います。
Q、ON、OFFとは何を意味しているのかいっこうにわかりません? A、ON=1、OFF=0。 服飾デザイナでプログラマじゃないので参考程度に。 まあ、昔は、スイッチってもんがあって、それをオン・オフしてビットを入力したもんです。 ですから、「ON=1、OFF=0」の理解で間違いないのじゃないですかね。 ところで、JISコード'A'を16進数で表せば 0x8260。 これをビット表現すれば、次のようです。 10000001001100000 この場合、ビットスイッチは、左からオン・オフすることはないんじゃないですか? 0 ---> 000 6 ---> 100 2 ---> 001 と、当然に数字ですから下桁から入力していきます。 普通は、下桁から意識するもんです。 /* getbits: Pの位置からnビットを取ってくる */ unsigned getbits(unsigned x, int p, int n) { return (x >> (p+1-n)) & ~(~0 << n); } 「仮定としてビット位置0は右端で、nとpは意味のある正の値とする。」 (「プログラミング言語C第二版」61ページ) 私は、このように学んできました。 >変数cの2ビット目と3ビット目をONにする・・・。 しかし、XXビット目とは、明らかに左からの数え方。 解せないですね。
お礼
ご回答ありがとうございました。 C言語はメモリを意識してコーディングしなくてはいけないと 人から聞いたことがあります。なかなか、難しそうです。 ちなみに 問)int aとして変数aの2ビット目と3ビット目をONにする。 解) a = a | 0x000C; となってました。ここでいう0x000Cとは 0000 0000 0000 1100 のことを言っていると解釈すればいいのですね。
- tatsu99
- ベストアンサー率52% (391/751)
あなたの考えていることであってますよ。 ONとは1で、OFFとは0の状態を示します。 本来、これは、単なる決め事なので、その表記を記述する場合も、 上記のことを、最初に述べるべきなのですが、 通常は、ONは1で、OFFは0で扱うのが、一般的なので、 記述されたかたは、そのことを忘れていたのかと思います。 (信号の赤は、とまれ、青は進めの決め事と同じです。 赤は、進め、青は止まれでも、決め事としては、それで よいのですが、そうすると事故が、多くなるのでそうはしません。 同じように、ONは0で、OFFは1でもよいのですが、 通常は、そのようには、決めません)
お礼
さっそく、ご回答下さってありがとうございました。 C言語のビットの概念はある程度は学習したので、イメージとしては わかっていたつもりでしたが、実際問題でON、OFFにするとでてきた 時に、頭の中でこんがらがってしまいました。 今後はポインタ、構造体と学習していくことになりますがじっくり 習得していきたいと思います。
お礼
回答者様、丁寧な解説ありがとうございました。 これで問題のほうもなんとか解決できそうです。 >単純に、どこどこのビットを1にしたいからと、相当するビットに1を「足して」しまうと、たまたま元のビットが0ならばいいのですが、1ならば「繰り上げ」が起こってしまいます。 なるほど、ただ単に1を足せばいいということではないのですね! だからONにするという処理では、ビット和を用いているのですね。 「繰り上げ」ですか....。 もう少し学習してみます。