2

設定されているフラグが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が最下位ビットであるバイナリを意味するとします。


結果がビット演算で設定されていると仮定します。

あなたの番号は2バイトでできています。すべての数値が00で終わるため、右(重要度の低い)バイトは常に0b00000000です。左(重要度の高い)バイトを見てみましょう。

bColdbHotの両方がオンになっている場合0x4100==0b01000001

bColdbHotの両方がオフになっている場合0x8200==0b10000010

bColdがオンでbHOTがオフ の場合0x8100==0b10000001

bColdがオフでbHOTがオン の場合0x4200==0b01000010

これから、左端の2ビットがbHotを設定し、右端の2ビットが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

0x0200 + 0x8000 = 0x8200結果は、たとえば両方がオフの場合など、数値を加算するだけで設定できます。


結論

ご覧のとおり、最終的な結果は次のとおりです。

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

*bHot*  OFF: 0x8000, ON: 0x4000
于 2012-07-17T05:38:41.880 に答える
1

とすれば

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

bHotは同じままであるため、最初の0.5バイトである可能性があり、bColdは、変更されるため、次の0.5バイトである可能性があります。このようにして、次のようになります。

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

おそらく他の解決策が存在します、私はチェックしていません。更新:はい、他の解決策も存在します。「bCold is OFF」などの4つのステートメントに変数を割り当て、4つの方程式のシステムとしてステートメントを記述します。上記を[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
于 2012-07-17T05:25:57.283 に答える
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はオフマスクです。

于 2012-07-17T05:45:46.760 に答える