从逐位OR组合中确定原始常数

Determining original Constants from bitwise OR combinations

本文关键字:原始 常数 组合 OR      更新时间:2023-10-16

假设我只有两个正在设置的标志(bOld和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

知道了以上内容,我应该将bOld和bHot设置为相等的值吗?

#define bCold  ((ULONG)0x???)
#define bHot   ((ULONG)0x???)
// Turn them on sometime later
long lCONFIG_FLAGS = bCold | bHOT; 

假设0bXXXXXXXY表示二进制,其中Y是小于的有效位。


假设结果是用逐位操作设置的:

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

bOldb Hot均打开时=0x4100=0b01000001

bOldb Hot均关闭时=0x8200=0b10000010

如果bOld为ON且bHOT关闭=0x8100=0b10000001

如果bOld为OFF,且bHOT处于ON=0x4200=0b01000010

从中可以看出,最左边的两位设置bHot,最右边的两位则设置bOld(右=较低有效性)。

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

该结果通过按位"1"来设置;OR";


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

(这是错误的,因为你的帖子名称中包含了按位或提及,但还是让我们尝试一下,只是为了好玩)一个简单的方程将显示这些数字:

*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: 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

逐位异或交替值以获得感兴趣的位,然后逐位和这些位以获得实际掩码:

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是掩码外

假设

When bCold and bHot are both turned OFF = 0x8200
If bCold is ON and bHOT is OFF =  0x8100

bHot可能是前半个字节,因为它保持不变,bOld是后半个字节,由于它发生了变化。这样你就可以得到:

bHot  is ON:  0x4000
bCold is ON:  0x0100
bHot  is OFF: 0x8000
bCold is OFF: 0x0200

可能还有其他解决方案,我还没有检查更新:是的,确实存在其他解决方案:将变量分配给"b关闭"等四个语句,并将这些语句写成四个方程组。你会发现,你会得到无限多的解决方案,通过调整上面的倍数[1-11-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