これには答えがあるかもしれませんが、理解できる答えが見つからなかったので、許してください。
値を格納するために使用したいunsigned int (32 ビット) fooを持つ変数があるとします。例として、unsigned int 内に値 1 と 4 をフラグとして格納し、対応するバイナリの場所を1. fooは、0001 0010 になる最後の 8 ビットまですべてゼロのように見えます (右端の 0 は値 0 を表します)。ビットマニピュレーションを使用してこれを行うにはどうすればよいですか?
これには答えがあるかもしれませんが、理解できる答えが見つからなかったので、許してください。
値を格納するために使用したいunsigned int (32 ビット) fooを持つ変数があるとします。例として、unsigned int 内に値 1 と 4 をフラグとして格納し、対応するバイナリの場所を1. fooは、0001 0010 になる最後の 8 ビットまですべてゼロのように見えます (右端の 0 は値 0 を表します)。ビットマニピュレーションを使用してこれを行うにはどうすればよいですか?
このようなもの:
unsigned int const flag_one = 0x02; // 0000 0010
unsigned int const flag_four = 0x10; // 0001 0000
unsigned int myflag = flag_one | flag_four;
// to test:
if (myflag & flag_one) { /* flag one is set */ }
// to set:
your_flag |= flag_four; // ORs with 0001 0000
// to clear:
their_flag &= ~flag_four; // ANDs with 1110 1111
特定の場所をマークしたい場合は、ビットシフトを使用してください。以下に小さな例を示します。
void setflag(int * flag, int place)
{
// Or sets it to true if it's 0 or 1
*flag |= (1 << place);
}
int main(int argc, char const *argv[])
{
int flag = 0;
setflag(&flag, 1);
setflag(&flag, 4);
printf("Flag is now %d\n", flag);
return 0;
}
出力:
Flag is now 18
バイナリの 18 は 10010 であるため、基準を満たしています。