C++ c++;使用位操作在无符号int中存储值

C++ c++;使用位操作在无符号int中存储值,c++,bit-manipulation,C++,Bit Manipulation,也许有答案,但我找不到一个我能理解的答案,所以请原谅我 假设您有一个带有无符号int(32位)foo的变量,我想用它来存储值。例如,我想将无符号int中的值1和4存储为标志,使相应的二进制位置为1。foo随后看起来像全零,直到最后八位为0001 0010(最右边的0表示值0)。我如何使用位操作来实现这一点?类似这样的操作: unsigned int const flag_one = 0x02; // 0000 0010 unsigned int const flag_four = 0x10;

也许有答案,但我找不到一个我能理解的答案,所以请原谅我

假设您有一个带有无符号int(32位)foo的变量,我想用它来存储值。例如,我想将无符号int中的值1和4存储为标志,使相应的二进制位置为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;
}
二进制中的18是10010,因此符合您的标准

Flag is now 18