プロが教える店舗&オフィスのセキュリティ対策術

はじめまして、今C言語の学習(半月ほど)を行っている者ですが
ビット演算子のところで悩んでおります。

問題文に
変数cの2ビット目と3ビット目をONにする、
あるいはOFFにするといった表記がでてくるのですが
このON、OFFとは何を意味しているのかいっこうにわかりません。

(私の考えではONとは1を意味しており2ビット目、3ビット目を
ONにするとは
--------------------------------------------------------------
~1|1|0|0 (右から0ビット目、1ビット目、2ビット目、3ビット目)
--------------------------------------------------------------
ということを言っているのではないだろうかと思っています。)

ビットに関して私の勉強不足であることは十分に認識して
おりますが、何かヒントをいただけるとありがたく思っています。

宜しくお願いいたします。

A 回答 (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にする」で通用しちゃうんだ(私は、本によりマチマチだから、その都度「どっちからだ?」と確認してたけど・・・)。
    • good
    • 0
この回答へのお礼

回答者様、丁寧な解説ありがとうございました。
これで問題のほうもなんとか解決できそうです。

>単純に、どこどこのビットを1にしたいからと、相当するビットに1を「足して」しまうと、たまたま元のビットが0ならばいいのですが、1ならば「繰り上げ」が起こってしまいます。

なるほど、ただ単に1を足せばいいということではないのですね!
だからONにするという処理では、ビット和を用いているのですね。
「繰り上げ」ですか....。 もう少し学習してみます。

お礼日時:2007/12/02 11:29

問いは、「仮定としてビット位置0は右端で、nとpは意味のある正の値とする」の通りです。



[イミディエイト]
? 0 or 1
1
? 0 and 1
0

エクセルでの模擬テストです。
この結果を考えると納得がいくと思います。
    • good
    • 0
この回答へのお礼

なるほど、なんとなくイメージができました。

何度もご回答いただきありがとうございました。

お礼日時:2007/12/01 21:04

補足:



>右から0ビット目、1ビット目、2ビット目、3ビット目

これが、昔からの数え方。
私が言いたいのは、0ビット位置と書くか、但し書きがあってしかるべきということです。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございました。

ビットに関してはもっとじっくり学習していきたいと
思います。

お礼日時:2007/12/01 20:46

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ビット目とは、明らかに左からの数え方。
解せないですね。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございました。

C言語はメモリを意識してコーディングしなくてはいけないと
人から聞いたことがあります。なかなか、難しそうです。

ちなみに
問)int aとして変数aの2ビット目と3ビット目をONにする。
解) a = a | 0x000C;

となってました。ここでいう0x000Cとは
0000 0000 0000 1100
のことを言っていると解釈すればいいのですね。

お礼日時:2007/12/01 20:32

あなたの考えていることであってますよ。


ONとは1で、OFFとは0の状態を示します。
本来、これは、単なる決め事なので、その表記を記述する場合も、
上記のことを、最初に述べるべきなのですが、
通常は、ONは1で、OFFは0で扱うのが、一般的なので、
記述されたかたは、そのことを忘れていたのかと思います。
(信号の赤は、とまれ、青は進めの決め事と同じです。
赤は、進め、青は止まれでも、決め事としては、それで
よいのですが、そうすると事故が、多くなるのでそうはしません。
同じように、ONは0で、OFFは1でもよいのですが、
通常は、そのようには、決めません)
    • good
    • 0
この回答へのお礼

さっそく、ご回答下さってありがとうございました。

C言語のビットの概念はある程度は学習したので、イメージとしては
わかっていたつもりでしたが、実際問題でON、OFFにするとでてきた
時に、頭の中でこんがらがってしまいました。

今後はポインタ、構造体と学習していくことになりますがじっくり
習得していきたいと思います。

お礼日時:2007/12/01 20:10

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!