2

私はレジスタと、すべてをビット インデックスに変換するデータ シートを少し扱います。幸いなことに、バイナリリテラル拡張構文を持つgccを使用しているため、次のようなことができます

register |= 0b01000010;

他のオプションはもちろん、16進形式を使用することです

register |= 0x42;

時間の経過とともに 16 進数を少し扱っ​​てきましたが、この種のビット バンギングにはバイナリ形式の方が適していることがわかりました。4 と 2 のニブルを 0100 と 0010 のパターンに分解します。なので、バイナリ形式の方が見やすいと思います。ただし、バイナリ形式の問題は、境界を見つけるのが難しいことです。16 進形式を使用すると、ニブルが適切に分離されるため、ビットをより安全に "インデックス" できる場合があります。IOW、一番上で、余分な 0 を追加または省略しなかったため、ビット 6 ではなくビット 7 がオンになってしまうのではないかと心配する必要があります。

他の人が自分のケーキを持って食べるテクニック/トリックを開発したかどうか、私は興味があります. C で隣接する定数をストリングする必要がある場合

"Hello " "World"

コンパイラは、それらを 1 つのリテラルにマッシュアップするのに十分スマートです。これらの 2 進数で同様のことを行う方法があればいいのですが、たとえば、

0b0100 0010

マクロで奇妙なことをすることができます、おそらく

#define _(a, b) (((a) << 4) | (b))

そして、できるようになる

_(0b0100,0b0010)

しかし、それは正直言ってもっと悪いことであり、ニブルのペアに限定されています. 誰かが何か賢くて素敵なものを思いついたら、興味があります。

4

1 に答える 1

2

C では、整数定数を 10 進数、8 進数、および 16 進数で指定することに制限されています。または、シフトされた定数のグループを組み合わせます(質問の下のH2CO3のコメントによる)。それがあなたにとって十分に重要な場合は、定数を引用符で囲まれた文字列定数として指定し、(自分で書いた) 関数を呼び出してそれを変換し、その整数値を返すことができます。このような定数を指定したい場合は、その場所で関数を呼び出してください... int i = b("0100 1101 0011 1100"); ....または C++ を使用してください.... Binaryliters?を参照してください。C または C++ でバイナリ リテラルを使用できますか?

独自の文字列定数コンバーターを作成する場合は、[0,1] 以外の数字を無視するように設定できるため、指定内容に応じて任意の方法でビットをグループ化できます。

于 2012-12-08T06:42:51.780 に答える