2012-07-17 54 views
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; 
+1

你能把它寫成方程形式嗎? – Mysticial 2012-07-17 05:20:48

+1

這看起來更像是一個數學問題,而不是一個編程問題。 – 2012-07-17 05:23:20

+2

有沒有不斷的,你可以或以符合這些要求。例如,從bCold到off的轉換是從0x4200到0x4100的變化 - 這將刪除0x200位並將其添加到0x100位中。你將不得不在兩個操作中使用兩個不同的常量來做到這一點。 – cdhowie 2012-07-17 05:23:28

回答

2

假設0bXXXXXXXY意味着二元其中Y是顯著位。


假設結果將被設置爲位操作:

你的號碼是由兩個字節。權(少顯著)字節總是0b00000000,因爲所有的號碼00。最後讓我們看一下左邊的(更顯著)字節:

bColdbHot均導通= 0x4100 = 0b01000001

bColdbHot兩者均斷開= 0x8200 = 0b10000010

如果爲bCold是接通,bHOT是OFF = 0x8100 = 0b10000001

如果bCold是斷開,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」


假設結果通過簡單地添加數字來設置:

(這是錯誤的,因爲你的職位名稱包括按位或提及,但還是讓我們嘗試只是爲了好玩) 一個簡單的公式會告訴我們這些數字:

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

結果可以通過簡單地添加數字,例如設置0x0200 + 0x8000 = 0x8200用於關閉。


結論

正如你所看到的,所以最後的結果是:

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

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

考慮到,因爲它保持不變,並且bCold是下半年字節,因爲它改變

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

bHot可能是第一個半字節。這樣你會得到:

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 
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使用的第一字節的後半期,0100是上掩模,0200是關閉的掩模

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是面膜