C++ 从按位或组合确定原始常数

C++ 从按位或组合确定原始常数,c++,bit-manipulation,bitwise-or,C++,Bit Manipulation,Bitwise Or,假设我只有两个正在设置的标志(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)。我发现了所有可能的组合应该相等。那么,我如何从下面确定原始(或兼容)常数

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; 
鉴于此

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]的倍数,你会得到无穷多的解。例如,这也满足以下等式:

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
鉴于此

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]的倍数,你会得到无穷多的解。例如,这也满足以下等式:

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

假设
0bxxxxxxy
表示二进制,其中Y是低有效位


假设结果设置为按位操作:

您的数字由两个字节组成。由于所有数字都以00结尾,因此右侧(低有效)字节始终为0b00000000。让我们看一下左边(更重要的)字节:

当bCold和bHot都打开时=
0x4100
=
0b01000001

当bCold和bHot都关闭时=
0x8200
=
0b10000010

如果bCold打开而bHOT关闭=
0x8100
=
0b10000001

如果bCold关闭且bHOT打开=
0x4200
=
0b01000010

由此可以看出,最左边的两个位设置bHot,最右边的两个位设置bCold(右边=较低的有效性)

现在,加上正确的字节,我们说的总是零,你得到

*bHot* ON = 0x4000, OFF = 0x8000
*bCold*  ON = 0x0100, OFF = 0x0200
结果由按位“或”设置


假设结果是通过简单地添加数字来设置的:

(这是错误的,因为您的博文名包含按位或提及,但我们还是尝试一下,只是为了好玩) 一个简单的方程式将向我们展示这些数字:

*bCold* OFF: 0x0200, ON:  0x0100
*bHot*  OFF: 0x8000, ON:  0x4000
可以通过简单地添加数字来设置结果,例如,两个OFF的
0x0200+0x8000=0x8200


结论

如您所见,最终结果是:

*bCold* OFF: 0x0200, ON: 0x0100

*bHot*  OFF: 0x8000, ON: 0x4000

假设
0bxxxxxxy
表示二进制,其中Y是低有效位


假设结果设置为按位操作:

您的数字由两个字节组成。由于所有数字都以00结尾,因此右侧(低有效)字节始终为0b00000000。让我们看一下左边(更重要的)字节:

当bCold和bHot都打开时=
0x4100
=
0b01000001

当bCold和bHot都关闭时=
0x8200
=
0b10000010

如果bCold打开而bHOT关闭=
0x8100
=
0b10000001

如果bCold关闭且bHOT打开=
0x4200
=
0b01000010

由此可以看出,最左边的两个位设置bHot,最右边的两个位设置bCold(右边=较低的有效性)

现在,加上正确的字节,我们说的总是零,你得到

*bHot* ON = 0x4000, OFF = 0x8000
*bCold*  ON = 0x0100, OFF = 0x0200
结果由按位“或”设置


假设结果是通过简单地添加数字来设置的:

(这是错误的,因为您的博文名包含按位或提及,但我们还是尝试一下,只是为了好玩) 一个简单的方程式将向我们展示这些数字:

*bCold* OFF: 0x0200, ON:  0x0100
*bHot*  OFF: 0x8000, ON:  0x4000
可以通过简单地添加数字来设置结果,例如,两个OFF的
0x0200+0x8000=0x8200


结论

如您所见,最终结果是:

*bCold* OFF: 0x0200, ON: 0x0100

*bHot*  OFF: 0x8000, ON: 0x4000
逐位异或交替值以获得感兴趣的位,然后逐位和这些位以获得实际掩码:

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为on掩码,0x0200为off掩码

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为on掩码,0x8000为off掩码

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
逐位异或交替值以获得感兴趣的位,然后逐位和这些位以获得实际掩码:

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为on掩码,0x0200为off掩码

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在掩码下

你能把它转换成等式形式吗?这看起来更像是一个数学问题,而不是一个编程问题。没有常数可以或可以匹配这些要求。例如,从bCold关闭到打开的转换是从0x4200到0x4100的更改——这将删除0x200位并添加0x100位。您必须使用两个不同的常量在两个操作中完成此操作。我正在尝试确定如何在GUI程序中设置选项。这些是它正在设置的值。如果我知道原始常量,我可以在需要时执行“long lCONFIG_FLAGS=bCold | bHOT;”。这不是一个学校项目。0x4100的意思就是你写的东西?16640十进制?你能把它转换成方程形式吗?这看起来更像是一个数学问题,而不是一个编程问题。没有常数可以或符合这些要求。例如,从bCold关闭到打开的转换是从0x4200到0x4100的更改——这将删除0x200位并添加0x100位。您必须使用两个不同的常量在两个操作中执行此操作
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