0

特定のマスクで決定できるブランチレスのビット単位の操作を探しています:

マスク : 0xFF0000 値 : 0xAA0000 戻り値 : true

Mask : 0xFF0000 Value : 0xAA00AA return : false

マスク : 0xFF00FF 値 : 0xBB00AA リターン : true

マスク : 0xFF00FF 値 : 0x0000AA 戻り値 : false

マスク : 0xFF00FF 値 : 0xAA0000 戻り値 : false

Mask : 0xFF00FF Value : 0x0A00AA return : true

つまり、次の場合に true を返す必要があります。

  • マスクのバイトが 0 に設定されている場合、値は同じバイトを 0 にする必要があります。
  • マスクのバイトが > 0 に設定されている場合、値には 0 以外の同じバイトが必要です。

編集 :

0xFFFF00 と 0x00AA00 は一致してはなりません。マスクのバイトが 0 より大きい場合、値は同じバイトが 0 より大きい必要があります。

つまり、マスクにこのパターン [XX][00][XX] がある場合、値は同じでなければなりません。XX の値は 01 から FF までです。

ありがとう!

4

1 に答える 1

1

質問のとおり、下位 3 バイトのみを扱っていると想定しています。

簡単な解決策 (17 操作):

((mask & 0x0000FF) == 0) == ((value & 0x0000FF) == 0) &&
((mask & 0x00FF00) == 0) == ((value & 0x00FF00) == 0) &&
((mask & 0xFF0000) == 0) == ((value & 0xFF0000) == 0)

より良い解決策 (9 つの操作):

(((mask & 0x7F7F7F) + 0x7F7F7F | mask) & 0x808080) ==
(((value & 0x7F7F7F) + 0x7F7F7F | value) & 0x808080)

3 番目のソリューション (9 つの操作):

!((((mask & 0x7F7F7F) + 0x7F7F7F | mask) ^
((value & 0x7F7F7F) + 0x7F7F7F | value)) & 0x808080)

3 番目のソリューションは、!ゼロを合格として処理し、ゼロ以外を不合格として処理するようにコードが準備されている場合、式全体の周囲を削除することで 8 つの操作に減らすことができます。

于 2013-04-04T04:39:33.157 に答える