2

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

3 回答 3

2

假设这0bXXXXXXXY意味着二进制,其中 Y 是较低有效位。


假设结果是按位运算设置的:

您的数字由两个字节组成。右边(不那么重要)字节总是 0b00000000,因为所有数字都以 00 结尾。让我们看看左边(更重要)字节:

bColdbHot都打开时 = 0x4100=0b01000001

bColdbHot都关闭时 = 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

结果由按位“或”设置


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

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

*bCold* OFF: 0x0200, ON:  0x0100
*bHot*  OFF: 0x8000, ON:  0x4000

结果可以通过简单地添加数字来设置,例如0x0200 + 0x8000 = 0x8200两个都为OFF。


结论

如您所见,所以最终结果是:

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

*bHot*  OFF: 0x8000, ON: 0x4000
于 2012-07-17T05:38:41.880 回答
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

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

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

于 2012-07-17T05:45:46.760 回答
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
于 2012-07-17T05:25:57.283 回答