假设我只有两个正在设置的标志(bCold和bHot)。我发现所有可能的组合应该相等。那么如何从下面确定原始(或兼容)常量是什么?
When bCold and bHot are both turned ON = 0x4100
When bCold and bHot are both turned OFF = 0x8200
If bCold is ON and bHOT is OFF = 0x8100
If bCold is OFF and bHOT is ON = 0x4200
知道了上述内容,我应该将bCold和bHot设置为相等?
#define bCold ((ULONG)0x???)
#define bHot ((ULONG)0x???)
// Turn them on sometime later
long lCONFIG_FLAGS = bCold | bHOT;
答案 0 :(得分:2)
假设0bXXXXXXXY
表示二进制,其中Y是 less 有效位。
假设结果是按位操作设置的:
您的号码由两个字节组成。右(不太重要)字节始终为0b00000000,因为所有数字都以00结尾。让我们看一下左(更重要)字节:
当 bCold 和 bHot 都打开时=
0x4100
=0b01000001
当 bCold 和 bHot 都关闭时=
0x8200
=0b10000010
如果 bCold 为ON且 bHOT 为OFF =
0x8100
=0b10000001
如果 bCold 为OFF且 bHOT 为ON =
0x4200
=0b01000010
由此可以看出,最左边的两个位设置 bHot ,最右边的两个位设置 bCold (右=不太重要)。
So:
0b01000000 = *bHot* ON -= `0x40`
0b00000001 = *bCold* ON = `0x01`
0b10000000 = *bHot* OFF = `0x80`
0b00000010 = *bCold* OFF = `0x02`
现在,添加正确的字节,我们说总是为零,然后你得到
*bHot* ON = 0x4000, OFF = 0x8000
*bCold* ON = 0x0100, OFF = 0x0200
结果按位“OR”
设置假设仅通过添加数字来设置结果:
(这是错误的,因为您的帖子名称包含按位OR提及,但仍然让我们尝试它只是为了好玩) 一个简单的等式将向我们展示这些数字:
*bCold* OFF: 0x0200, ON: 0x0100
*bHot* OFF: 0x8000, ON: 0x4000
可以通过简单地添加数字来设置结果,例如OFF 0x0200 + 0x8000 = 0x8200
。{/ p>
结论
如您所见,最终结果是:
*bCold* OFF: 0x0200, ON: 0x0100
*bHot* OFF: 0x8000, ON: 0x4000
答案 1 :(得分:1)
鉴于此
When bCold and bHot are both turned OFF = 0x8200
If bCold is ON and bHOT is OFF = 0x8100
bHot可能是第一个半字节,因为它保持不变,而bCold是自更改以来的第二个半字节。这样你就得到了:
bHot is ON: 0x4000
bCold is ON: 0x0100
bHot is OFF: 0x8000
bCold is OFF: 0x0200
可能存在其他解决方案,我没有检查过。 更新:是的,确实存在其他解决方案:将变量分配给四个语句“bCold is OFF”等,并将语句写为四个方程的系统。你会发现通过将[1 -1 1 -1]的倍数调整为上面你会得到无限多的解。例如,这也满足方程:
Using + to add: Using XOR to add:
bHot is ON: 0x4100 bHot is ON: 0x4100
bCold is ON: 0x0000 bCold is ON: 0x0000
bHot is OFF: 0x8100 bHot is OFF: 0x8100
bCold is OFF: 0x0100 bCold is OFF: 0x0300
答案 2 :(得分:1)
C: ON H: ON = 0100 0001 0000 0000
C:OFF H:OFF = 1000 0010 0000 0000
C: ON H:OFF = 1000 0001 0000 0000
C:OFF H: ON = 0100 0010 0000 0000
逐位xor交替值得到有趣的位,然后逐位和这些位得到实际的掩码:
C:OFF OR C: ON = 1000 0010 0000 0000 XOR 1000 0001 0000 0000 = 0000 0011 0000 0000
C:OFF = 1000 0010 0000 0000 AND 0000 0011 0000 0000 = 0000 0010 0000 0000
C: ON = 1000 0001 0000 0000 AND 0000 0011 0000 0000 = 0000 0001 0000 0000
所以C使用第一个字节的后半部分,0x0100是掩码,0x0200是掩码
H:OFF OR H: ON = 1000 0010 0000 0000 XOR 0100 0010 0000 0000 = 1100 0000 0000 0000
H:OFF = 1000 0010 0000 0000 AND 1100 0000 0000 0000 = 1000 0000 0000 0000
H: ON = 0100 0010 0000 0000 AND 1100 0000 0000 0000 = 0100 0000 0000 0000
所以H使用第一个字节的前半部分,0x4000是掩码,0x8000是掩码