假设您的 unsigned int 有 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))
如果你想要更时尚的 c++,你可以把它们写成内联函数。无论如何,我写它更多是为了向您展示位操作是如何完成的,而不是作为宏还是函数来实现它。
要使其适用于不同大小的 int,您可以将 31 更改为:
instead of 31: ((sizeof(x)<<3)-1)
这基本上是sizeof(x)*8-1
PS如果有人想告诉我“不不!不要使用宏,这是C++,使用我写的这个过于复杂的东西”,省着气。只需给出 -1 并继续。
编辑:我上面写的是你的问题的答案:“如何使用符号位作为标志”。如果您想以更好的方式执行此操作,但不扩展内存使用量(通过添加 a bool
),您可以随时编写如下内容:
struct airplane
{
unsigned int id: 31;
unsigned int is_flying: 1;
};
airplane Boing = {777, false};
然后,分配和读取id
或is_flying
执行位操作,但它们由编译器处理。