unsignedintが32ビットであるとしましょう。
#define SET_FLYING(x) (x) |= (1<<31)
#define SET_GROUNDED(x) (x) &= ~(1<<31)
#define IS_FLYING(x) ((x) & (1<<31))
#define ID(x) ((x) & ~(1<<31))
よりスタイリッシュにしたい場合は、それらをインライン関数として記述できます。とにかく、私はそれをマクロとして実装するか関数として実装するかではなく、ビット操作がどのように行われるかを示すためにもっと書きました。
さまざまなサイズのintで機能させるには、31を次のように変更します。
instead of 31: ((sizeof(x)<<3)-1)
これは基本的にsizeof(x)*8-1
PS誰かが私に「いいえ、いいえ!マクロを使用しないでください。これはC ++です。私が書いたこの非常に複雑なものを使用してください」と言いたい場合は、息を止めてください。-1を付けて先に進んでください。
編集:私が上で書いたのは、あなたの質問に対する答えでした:「符号ビットをフラグとして使用する方法」。これをより良い方法で実行したいが、(を追加して)メモリ使用量を拡張しないbool
場合は、いつでも次のように記述できます。
struct airplane
{
unsigned int id: 31;
unsigned int is_flying: 1;
};
airplane Boing = {777, false};
次に、ビット演算の割り当てと読み取り、id
またはis_flying
ビット演算を実行しますが、これらはコンパイラによって処理されます。