也许有一个答案,但我找不到我理解的答案,所以请原谅我。
假设您有一个带有 unsigned int(32 位)foo的变量,我想用它来存储值。例如,我想将值 1 和 4 存储在 unsigned int 中作为标志,这使得相应的二进制位置1. foo然后看起来全为零,直到最后八位为 0001 0010(其中最右边的 0 表示值 0)。我如何使用位操作来做到这一点?
也许有一个答案,但我找不到我理解的答案,所以请原谅我。
假设您有一个带有 unsigned int(32 位)foo的变量,我想用它来存储值。例如,我想将值 1 和 4 存储在 unsigned int 中作为标志,这使得相应的二进制位置1. foo然后看起来全为零,直到最后八位为 0001 0010(其中最右边的 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,因此符合您的标准。