ビット単位でのフラグ管理の方法を調べています。
その上で何点か疑問が出てきましたので質問させて頂きます。
・10進数を2進数に変換する方法は2で割って余りを並べていくというものですが、別なやり方(標準関数など)はないのでしょうか。
・unsigned char EightFlag = NULL; と = 0 は同じ意味でしょうか。
・「a |= b」、「a ^= b」、「a ~= b」 と記述した場合、それぞれどのような判定が行われているのでしょうか。(真理値表というものをみたのですが意味がよくわかりませんでした)
以上です。
回答よろしくお願いします。
No.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になる)
上記が理解出来れば、目的は達するはずです。
再度のご回答有難う御座います。
>お礼の内容が良く理解できないのですが・・・^^;
上手く説明できず申し訳ありません。
>16進数で表現すれば、内部的にはbitを操作してるのと同じ事です。
基本10進、2進でフラグ管理を行おうとしていました。(A~Fが出てくるとややこしく思えたため)
>0x01:B00000001 ~EventFlg |= 0x01; ~
成程、こういう記述の仕方をするんですね。
16進数で代入というのは慣れていませんが、フラグ管理の方法は理解できました。
誠に有難うございます。
No.3
- 回答日時:
>・10進数を2進数に変換する方法は2で割って余りを並べていくというものですが、別なやり方(標準関数など)はないのでしょうか。
10進数とはなんのことでしょうか? 10進文字列? であればscanf系の%dとかが基本ですよね。
>・unsigned char EightFlag = NULL; と = 0 は同じ意味でしょうか。
それはNULLの定義によります。大概の人は0と定義すると思いますけど、処理系で保証されているわけではありませんので、デバッグの際には必ず追いかけます。
>・「a |= b」、「a ^= b」、「a ~= b」 と記述した場合、それぞれどのような判定が行われているのでしょうか。(真理値表というものをみたのですが意味がよくわかりませんでした)
判定とは? それらは全部代入演算子ですけど。
真理値表がわからないなら、真理値表を勉強するしかないです。
回答有難う御座います。
>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
という読み方であっていますでしょうか。
No.2
- 回答日時:
>・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つのお礼に関して、大変申し訳ありませんでした。
回答有難う御座います。
>「ビット単位でのフラグ管理」には「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;
}
のような処理が内部で走っているものと思っていました。
No.1
- 回答日時:
質問内容からして、基本的な論理式を理解されていないと思われます。
ビット操作を行う前に、まずは論理式を勉強しませう。
>10進数を2進数に変換する方法
論理式が解れば、こんな質問は出てこないはず。
10進→2進変換など不要、全く無意味です。
回答有難う御座います。
>論理式が解れば、こんな質問は出てこないはず。
論理式について調べてみました。
確認させて頂きたいのですが、真理値表はあくまで1ビット毎の計算結果であるという理解でよろしいでしょうか。
>10進→2進変換など不要、全く無意味です。
おっしゃる通り、EightFlag = 0 とすれば変換の必要もなく 00000000 ですし、 = 255 とすれば 11111111 でしかありません。
しかし、 EightFlag = Henkan(255); のような記述ができれば、、デバッグ時に理解しやすいと思いました。
ビット演算を学ぶ上でソースの見やすさを優先したかったのです。(Henkan()は10進数を2進数に変換する関数とお考えください)
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(学校・勉強) この中で間違ってある説明はありますか?詳しい方に教えていただきたいです。 A. 1つのプログラムが複 2 2023/07/14 01:15
- 計算機科学 2進数の計算について 2進数の値は全て8ビットで負数は2の補数形式とする。結果が8ビットで表現出来な 3 2023/07/22 14:08
- 情報処理技術者・Microsoft認定資格 2進数の問題を教えてください。 1 2022/07/27 09:42
- 情報処理技術者・Microsoft認定資格 情報技術の問題についてです。 10進数の−36を以下のような16ビットの浮動小数点表示にするといくつ 3 2022/05/21 19:53
- 工学 疑似乱数生成器 3 2023/01/05 02:06
- 数学 以下の問題が分かりません。 8ビット浮動小数点数が、最上位ビットから順に符号1ビット、指数部3ビット 4 2023/07/22 16:06
- 統計学 t検定について教えてください 2 2023/02/23 16:35
- 生物学 【生命科学】ヒトが1日に消費するATP量?(精度を変えて再計算) 3 2022/10/07 18:48
- その他(コンピューター・テクノロジー) 量子コンピュータの動作原理がわかりません。同じビットが、1でも0でも有って良いだろうか? 3 2023/02/04 03:20
- Excel(エクセル) エクセルの関数に関しての質問です。 5 2022/10/07 11:17
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
だれがとけるの?
-
バッチファイルで以下のような...
-
VisualStudio2022でC言語プログ...
-
C言語関数違いについて。
-
win10で、正確な待ち時間の作り方
-
C言語 列挙型(enum型)変数について
-
大量のデータを読み込んで表示...
-
Linux Cプログラミングを学ぶた...
-
Windows Formアプリからコンソ...
-
S-JIS → JIS コード変換するには
-
Linuxでの開発環境構築や設定の...
-
こんなことてしますか??
-
double型が正常に認識されてい...
-
MACで動く実行ファイルをWindow...
-
LinuxカーネルのCFSで用いられ...
-
Int('1234') で、strをかんたん...
-
gcc13.2のバグ?
-
C言語 バッファについて。
-
PC画面を録画するプログラムでd...
-
C言語階乗の総和を求める
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
何に見える?って心理テストが...
-
どんな形であれ、大事にしたい...
-
合理的と効率的は同じ意味です...
-
日本語の文の意味を教えてお願...
-
【良い】と【悪い】の使い方の...
-
気になる男性に、「声が聞きた...
-
C++ ビット演算
-
指紋採取で一致させない方法を...
-
職場ですぐ後ろに立ってくる男性
-
後ろを歩かれるの嫌な方いらっ...
-
「クレームは宝の山」という意...
-
後ろに立つ男子の気持ちは?
-
ネットに顔写真を載せるな。そ...
-
席替えをした時に好きな人が隣...
-
勝手にあだ名で呼ばれたら嫌で...
-
わざとぶつかる人って何考えて...
-
起きられず寝坊したら試用期間...
-
最終面接後の面談について
-
友達の名前が しほ という名前...
-
あけみという名前をあだ名でよ...
おすすめ情報