バイト配列(つまりchar)のビットが同じタイプの別の配列のサブセットであるかどうかを確認する必要があります。たとえば、0001.0011(19) 0011.0011(51)のサブセットであり、0000.1011(11)はそうではない。バイナリ配列がC内の別の配列のサブセットであるかどうかを確認
私はビット演算で遊んで開始し、ほとんどXOR/OR/XOR配列とそれを解決:
int is_subset (char *set_a, char *set_b, int size)
{
/* The operation is performed with three bitwise operations, resulting in a
* sequence of bits that will be equal to zero if set_a is a subset of
* set_b. As a bonus, the positions where the sets differ will be
* available in the resulting sequence, and thus the number of differing
* positions can be obtained by counting the number of bits set (for exemple,
* with __builtin_popcount in GCC).
*
* Exemple (TRUE): Exemple (FALSE):
* ================ ================
* set_a 00010011 set_a 00001011
* set_b 00110011 set_b 00110011
* ---------------- ----------------
* XOR 00100000 XOR 00111000
* set_b 00110011 set_b 00110011
* ---------------- ----------------
* OR 00110011 OR 00111011
* set_b 00110011 set_b 00110011
* ---------------- ----------------
* XOR 00000000 XOR 00001000
*/
int i;
for (i = 0; i < size; i++)
if ((((set_a[i]^set_b[i]) | set_b[i])^set_b[i]) != 0)
return FALSE;
return TRUE;
}
しかしset_a
がゼロ(0000.0000)である場合には(常にTRUEを返す)は失敗します。私は別の戦略(ブルームフィルターなど)を試みましたが、おそらく私のプログラミングスキルのために、それは速く、少なくとも優雅にはほど遠いものでした。
例外なくこれを行う標準的でエレガントな方法はありますか?
EDIT:この文脈では、「サブセット」は、第1の配列(set_a)のTRUEビットがすべて第2のもの(TRUE)であることを意味する。 2番目の配列にTRUEという別のビットがあるかもしれませんが、最初の配列ではFALSEかどうかは関係ありません。
の特殊なケースを除外すべきであるおそらく、私は、問題の何かが欠けているんだけど、Aのあなたの定義は何ですかこの文脈でサブセット? – Corbin
申し訳ありませんが、質問を編集しました! – Giacomo
サブセットの定義が、あなたのコードで判断していると思われる場合は、配列で私たちを悩ますべきではありません。そして、あなたは '1'ビットintの別のintの '1'ビットのサブセットです。 –