dポイントプレゼントキャンペーン実施中!

ビット単位でのフラグ管理の方法を調べています。
その上で何点か疑問が出てきましたので質問させて頂きます。
・10進数を2進数に変換する方法は2で割って余りを並べていくというものですが、別なやり方(標準関数など)はないのでしょうか。
・unsigned char EightFlag = NULL; と = 0 は同じ意味でしょうか。
・「a |= b」、「a ^= b」、「a ~= b」 と記述した場合、それぞれどのような判定が行われているのでしょうか。(真理値表というものをみたのですが意味がよくわかりませんでした)
以上です。
回答よろしくお願いします。

A 回答 (4件)

No.1です。


お礼の内容が良く理解できないのですが・・・^^;

16進数で表現すれば、内部的にはbitを操作してるのと同じ事です。
例えば1byte(8bit)単位では
0x01:B00000001
0x02:B00000010
0x04:B00000100
0x08:B00001000


0x80:B10000000
※BはBinary(2進数)であることを示す

以下、これを応用

unsigned char EventFlg = 0 ; //8bitの変数宣言と初期化

EventFlg |= 0x01 ; //0x01とOR(論理和)することによりEventFlgのB0(1bit目)がON(1になる)
EventFlg |= 0x10 ; //0x10とOR(論理和)することによりEventFlgのB4(5bit目)がON(1になる)
EventFlg |= 0x0F ; //0x0FとOR(論理和)することによりEventFlgのB0~B3(1bit目~4bit目)がON(1になる)
EventFlg &= 0xFE ; //0xFEとAND(論理積)することによりEventFlgのB0(1bit目)だけをOFF(0になる)

上記が理解出来れば、目的は達するはずです。
    • good
    • 0
この回答へのお礼

再度のご回答有難う御座います。
>お礼の内容が良く理解できないのですが・・・^^;
上手く説明できず申し訳ありません。
>16進数で表現すれば、内部的にはbitを操作してるのと同じ事です。
基本10進、2進でフラグ管理を行おうとしていました。(A~Fが出てくるとややこしく思えたため)
>0x01:B00000001 ~EventFlg |= 0x01; ~
成程、こういう記述の仕方をするんですね。
16進数で代入というのは慣れていませんが、フラグ管理の方法は理解できました。
誠に有難うございます。

お礼日時:2009/05/01 17:03

>・10進数を2進数に変換する方法は2で割って余りを並べていくというものですが、別なやり方(標準関数など)はないのでしょうか。



10進数とはなんのことでしょうか? 10進文字列? であればscanf系の%dとかが基本ですよね。

>・unsigned char EightFlag = NULL; と = 0 は同じ意味でしょうか。

それはNULLの定義によります。大概の人は0と定義すると思いますけど、処理系で保証されているわけではありませんので、デバッグの際には必ず追いかけます。

>・「a |= b」、「a ^= b」、「a ~= b」 と記述した場合、それぞれどのような判定が行われているのでしょうか。(真理値表というものをみたのですが意味がよくわかりませんでした)

判定とは? それらは全部代入演算子ですけど。
真理値表がわからないなら、真理値表を勉強するしかないです。
    • good
    • 0
この回答へのお礼

回答有難う御座います。
>10進数とはなんのことでしょうか? 10進文字列? であればscanf系の%dとかが基本ですよね。
変換指定子ですか、失念しておりました。有難うございます。
>処理系で保証されているわけではありませんので~
同じC++でもCPUやコンパイラによっては値が変わるということでしょうか。
>判定とは? それらは全部代入演算子ですけど。
先に記述しましたがどうにも10進数の考え方が抜けきらないものでして、a = a + b のような一文で書ける処理ではないのでは、と思ってしまいます。
真理値表を学ぶと同時に認識を変えていこうと思います。
>真理値表がわからないなら、真理値表を勉強するしかないです。
宜しければ確認させて頂きたいのですが、
b = 11 と c = 01 で論理積であれば
//2ビット目
if(1 == 0){ //False
a = 1;
}else{
a = 0;
}
//1ビット目
if(1 == 1){ //True
a = 1;
}else{
a = 0;
}
結果:a = 01
という読み方であっていますでしょうか。

お礼日時:2009/05/01 16:27

>・10進数を2進数に変換する方法は2で割って余りを並べていくというものですが、別なやり方(標準関数など)はないのでしょうか。



「ビット単位でのフラグ管理」には「10進」「2進」は不要な概念です。

なので、やり方もクソもありません。単に

#define IS_RED 1
#define IS_BLUE 2
#define IS_YELLOW 4
#define IS_GREEN 8

とか

#define O_RDONLY 0
#define O_WRONLY 1
#define O_RDWR 2
#define O_ACCMODE 3
#define O_DENYALL 0x10
#define O_DENYWRITE 0x20
#define O_DENYREAD 0x30
#define O_DENYNONE 0x40
#define O_NOINHERIT 0x80
#define O_CREAT 0x0100
#define O_TRUNC 0x0200
#define O_EXCL 0x0400
#define O_APPEND 0x0800
#define O_CHANGED 0x1000
#define O_DEVICE 0x2000
#define O_TEXT 0x4000
#define O_BINARY 0x8000

とかの「定義」が存在するだけです。

「値が各ビットに対応していれば良い」ので、それが10進だろうが8進だろうが4進だろうが2進だろうが、どういう表記であっても関係ありません。

>・unsigned char EightFlag = NULL; と = 0 は同じ意味でしょうか。

「同じ意味かどうかは不明」です。

「NULLがどう定義されているのか不明」なので、同じ意味かどうかも「不明」です。

>・「a |= b」、「a ^= b」、「a ~= b」 と記述した場合、それぞれどのような判定が行われているのでしょうか。(真理値表というものをみたのですが意味がよくわかりませんでした)

「判定」など行われません。

単に「ビット演算」と「代入」が行われるだけです。

「判定」が行われるのは「式を『判定式』に使用した場合」のみです。

因みに「a |= b」は「a = a | b」と同じ意味、「a ^= b」は「a = a ^ b」と同じ意味で、aとbをビット演算(それぞれ、論理和、排他的論理和)して、結果をaに代入します。また「a ~= b」は構文エラーなのでコンパイル出来ません。

>真理値表というものをみたのですが意味がよくわかりませんでした

真理値表が理解できない場合、ビット単位でのフラグ管理は絶対に理解出来ません。

真理値表について学び、真理値表が理解できた時に、もう一度質問して下さい(早い話が「お話にならない」って事)

この回答への補足

記述に間違いがありました。
if(b == c){
ではなく
if(b == 1 && c == 1){
です。
上記に2つのお礼に関して、大変申し訳ありませんでした。

補足日時:2009/05/01 16:29
    • good
    • 0
この回答へのお礼

回答有難う御座います。
>「ビット単位でのフラグ管理」には「10進」「2進」は不要な概念です。
表記上は不要かもしれませんが、概念として理解している必要はあるのではないのでしょうか。
0、1信号(機械語)は2進数表記ですし、フラグという意味で0(False)、1(True)という考え方は必要な気がするのですが。(間違っていたらすみません)
>「NULLがどう定義されているのか不明」なので、同じ意味かどうかも「不明」です。
NULLの定義が不明というのは初耳でした。
if文で NULL を入れた変数と 0 が入った変数を比較すると True の結果が返ってきたため、疑問に思っていました。
>「判定」など行われません。
ビット演算子を調べると、ANDやORなどの記述が見られたため、単純な計算ではないのかと考えていました。
例えば論理積の場合:a = b & c;
if(b == c){ //判定
a = 1;
}else{
a = 0;
}
のような処理が内部で走っているものと思っていました。

お礼日時:2009/05/01 16:05

質問内容からして、基本的な論理式を理解されていないと思われます。


ビット操作を行う前に、まずは論理式を勉強しませう。

>10進数を2進数に変換する方法
論理式が解れば、こんな質問は出てこないはず。
10進→2進変換など不要、全く無意味です。
    • good
    • 0
この回答へのお礼

回答有難う御座います。
>論理式が解れば、こんな質問は出てこないはず。
論理式について調べてみました。
確認させて頂きたいのですが、真理値表はあくまで1ビット毎の計算結果であるという理解でよろしいでしょうか。
>10進→2進変換など不要、全く無意味です。
おっしゃる通り、EightFlag = 0 とすれば変換の必要もなく 00000000 ですし、 = 255 とすれば 11111111 でしかありません。
しかし、 EightFlag = Henkan(255); のような記述ができれば、、デバッグ時に理解しやすいと思いました。
ビット演算を学ぶ上でソースの見やすさを優先したかったのです。(Henkan()は10進数を2進数に変換する関数とお考えください)

お礼日時:2009/05/01 15:39

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