特定のバイトからすべてのビットを取得(および表示)できるユニオンを作成する必要があります。 それは理にかなっていますか?私はビット単位の演算子でそれを行う方法を知っていると思うが、同じ効果のためにどのようにユニオンを使用するか考えていない。C Union - すべての8ビットを表示する
答えて
ビット単位の操作を使用することをお勧めします。あなたはあまりにもビットを抽出するために労働組合とビットフィールドを組み合わせた、しかし、ノート、これは、しかし、これは推奨されない理由である、あなたの学習のためにここにサンプルエンディアンに依存することができます。
#include <stdio.h>
#include <string.h>
union Bits {
char b;
struct bits {
#ifdef LITTLE_ENDIAN
unsigned int b0: 1;
unsigned int b1: 1;
unsigned int b2: 1;
unsigned int b3: 1;
unsigned int b4: 1;
unsigned int b5: 1;
unsigned int b6: 1;
unsigned int b7: 1;
#else
// reverse the order of the bit fields.
#endif
} bits;
};
int main(void) {
char a = 'A';
union Bits b;
b.b = a;
printf("0x%x\n", a);
printf("%d%d%d%d%d%d%d%d\n", b.bits.b7, b.bits.b6, b.bits.b5, b.bits.b4, b.bits.b3, b.bits.b2, b.bits.b1, b.bits.b0);
return 0;
}
この出力すべき
0x41
01000001
いいえ。ビットフィールドの順序を指定することはできません。ビットフィールドの順序は実装定義です。 ** ** 6.7.2.1 [C標準](http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf)のパラグラフ11の構造および連合指定子**、 ...単位内のビットフィールドの割り当て順序(上位から の下位または下位から上位への)は実装定義です... " –
これは実装定義であり、その理由は私はエンディアンと携帯ではなく、ビットフィールドの順序を述べることはできないと言いました。 :) – fluter
これはエンディアンに依存するだけではなく、異なるコンパイラがビットフィールドを異なる方法で扱うことができます。だからあなたは本当にどちらのビットがどれか分からない。それらのうちのいくつかもそれをねじ込む:https://lwn.net/Articles/478657/ –
8ビットのビットフィールドを含むunit8_t
とstruct
の和集合を使用できます。ただし、それによって個々のビットにアクセスできるようになりますが、それらのビットがどれか分かりません。これは、コンパイラがビットフィールドを基になるバイトに割り当てる方法に依存します。これはターゲットマシンのエンディアンに依存します。
this SO Q&Aを参照してください。
**あなたはどのビットであるか分からないでしょう!**それを指摘してくれてありがとう。 –
C99は、我々は物事が容易になり、匿名の構造体と共用体を持っているので:
#include <stdio.h>
#include <stdbool.h>
#include <inttypes.h>
union disByte
{
uint8_t byte;
// Assuming little endian
struct {
bool b0: 1;
bool b1: 1;
bool b2: 1;
bool b3: 1;
bool b4: 1;
bool b5: 1;
bool b6: 1;
bool b7: 1;
};
};
int main()
{
union disByte foo;
foo.byte = 42;
printf("%d %d %d %d %d %d %d %d\n", foo.b0, foo.b1, foo.b2, foo.b3, foo.b4, foo.b5, foo.b6, foo.b7);
}
ただし、ビット操作が通常好ましい(あなたの質問は、ビットmanipulati」タグ付けされていますに")。ビット操作を使用しての
#define XTH_BIT_OF(NUM, X) (bool)(NUM & (1U << X))
利点は以下のとおりです。
- あなたはエンディアンを心配する必要はありません。
- もっと短くて鮮明に見えます。 あなたはこのようにこれを行うには、ビットフィールドと組合を使用することができます
:
#include <stdio.h>
typedef union {
struct {
unsigned int:0;
unsigned int firstBit : 1;
unsigned int secondBit : 1;
unsigned int thirdBit : 1;
unsigned int fourthBit : 1;
unsigned int fifthBit : 1;
unsigned int sixthBit : 1;
unsigned int seventhBit : 1;
unsigned int eigthBit : 1;
};
int raw;
} bitsOfByte;
int main()
{
bitsOfByte dt;
dt.raw = 254;
printf("Bits are %d/%d/%d/%d/%d/%d/%d/%d", dt.firstBit, dt.secondBit, dt.thirdBit, dt.fourthBit, dt.fifthBit, dt.sixthBit, dt.seventhBit, dt.eigthBit);
return 0;
}
この実装では、最初のビットは、下位ビット
これはC99固有のものです –
- 1. C#で2組のUnionを表示
- 2. SQL Unionですべての結果が表示されない
- 3. バイトからバイナリ文字列へC# - すべての8桁を表示
- 4. C:すべてのミリ秒表示(OpenGL)
- 5. C# - 8ビットまたは16ビットのグレースケール生のピクセルデータを変換する
- 6. ユニコードでのORACLE 8ビット・キャラクタ全体の表示
- 7. Cプリプロセッサでの8ビットCRCの計算?
- 8. C#でフォームのすべての非表示コントロールを表示するには?
- 9. C - 8ビットが32ビットであるかどうかをチェックする方法?
- 10. ラベルのすべての項目を表示する方法Xcode 8
- 11. C#:アセンブリ内のすべてのクラスを一覧表示する
- 12. 負の数のAndroid 8ビットから16ビットへの表現
- 13. 8ビットのバイナリコード
- 14. C++の8ビット整数と32ビット整数のビット単位の論理和
- 15. GameObjectを非表示にしてすべて表示ソートGameObject Unityを隠すC#
- 16. C - char(8ビット)をascii形式に変換するには
- 17. 32bit rgbイメージを8ビットrgbに変換するC++
- 18. SQL order by unionすべてのクエリ
- 19. SQL Unionすべての質問
- 20. すべてのゲームを表示する
- 21. 16ビットを8ビットの2つの部分に分割する
- 22. 1ビットのビットマップを8ビットのビットマップに変換するxamarin
- 23. 16ビットのベクトルに8ビットのベクトルを配置する
- 24. C union assigment
- 25. すべてのC#ファイルをutf-8エンコーディングに変換する
- 26. 8ビットMCUでの32ビット可変シフト
- 27. 64ビットの数値を8ビットに変換する方法
- 28. オブジェクトにビットを表示
- 29. 64ビット整数のすべてのビットと32ビット整数を比較する
- 30. リバースエンジニアリング8ビットCRC
であるあなたはビットフィールドを意味しないことに注意してください代わりに?組合はそれのためではない。 – fluter
ビット演算子を使用すると何が問題になりますか? –