[英]Bitwise setting in C++
#define OUTGOING_MASK 0x0c
#define OUTGOING_DISABLED 0x04
#define OUTGOING_ENABLED 0x08
#define OUTGOING_AUTO 0x00
#define REFER_SUPPORTED 0x80
假设support
是int类型的一些值。 我有一个getter功能
int get()
{
if(OUTGOING_DISABLED == support & OUTGOING_MASK)
return 1;
else if(OUTGOING_ENABLED == support & OUTGOING_MASK)
return 2;
else if(OUTGOING_AUTO == support & OUTGOING_MASK)
return 3;
}
我需要为此编写set函数
void set(int val)
{
if(val ==1)
//todo
else if(value == 2)
//todo
else if(value == 3)
//todo
}
如何为此编写getter和setter函数? 我需要在这里获取/设置support
变量
REFER_SUPPORTED将始终设置为support
。
我有一个声明,如a1 = b&a2; 如何使用按位运算符知道b的值?
除非设置了ALL位,否则无法恢复b的值。 “&”是不可逆转的。
说明。 &操作有以下表格:
a b result
1 & 1 = 1
0 & 1 = 0
1 & 0 = 0
0 & 0 = 0
这意味着,要恢复b,您可以尝试使用下表:
a result b
0 0 unknown - could be 1 or 0
0 1 invalid/impossible - could not happen
1 0 0
1 1 1
如你所见,在所有情况下都无法猜测b。
在表达式a&b = c中,如果你知道c和a,则无法恢复b,因为对于c的每个零位,并且如果a的对应位也为零,则b的相应位有两种可能的状态。 。 只有当a的每个位都设置为1时,才能可靠地恢复b。
你没有。 通常,只有a1
和a2
才能恢复该信息。 要看到这一点,请考虑a2 == 0
的情况。 b & 0
始终为0。
以下是您想要的:
void set(int val)
{
support &= ~OUTGOING_MASK;
support |= REFER_SUPPORTED;
if(val == 1)
{
support |= OUTGOING_DISABLED;
}
else if(value == 2)
{
support |= OUTGOING_ENABLED;
}
else if(value == 3)
{
support |= OUTGOING_AUTO;
}
}
如果是这样,那么我相信你的getter功能也是错误的。
根据我的理解,它应该如下:
int get() { if(OUTGOING_DISABLED == ((support & OUTGOING_MASK) >> 2)) return 1; else if(OUTGOING_ENABLED == ((support & OUTGOING_MASK) >> 2)) return 2; else if(OUTGOING_AUTO == ((support & OUTGOING_MASK) >> 2)) return 3; }
您可以使用以下代码打印出二进制等效项
void printBit(int n)
{
unsigned int i;
i = 1<<(sizeof(n) * 8 - 1);
while (i > 0)
{
if (n & i)
{
printf("1");
}
else
{
printf("0");
}
i >>= 1;
}
}
这只会打印出二进制等效的'b'。 那是你想做的吗?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.