📄 vbitset.c
字号:
*dstp = 0; } } memset (dstp, 0, sizeof (bitset_word) * (dsize - ssize1)); return changed;}static voidvbitset_andn (bitset dst, bitset src1, bitset src2){ unsigned int i; bitset_word *src1p; bitset_word *src2p; bitset_word *dstp; bitset_windex ssize1; bitset_windex ssize2; bitset_windex dsize; vbitset_resize (dst, max (BITSET_SIZE_ (src1), BITSET_SIZE_ (src2))); dsize = VBITSET_SIZE (dst); ssize1 = VBITSET_SIZE (src1); ssize2 = VBITSET_SIZE (src2); dstp = VBITSET_WORDS (dst); src1p = VBITSET_WORDS (src1); src2p = VBITSET_WORDS (src2); for (i = 0; i < min (ssize1, ssize2); i++) *dstp++ = *src1p++ & ~(*src2p++); if (ssize2 > ssize1) { for (; i < ssize2; i++) *dstp++ = 0; memset (dstp, 0, sizeof (bitset_word) * (dsize - ssize2)); } else { for (; i < ssize1; i++) *dstp++ = *src1p++; memset (dstp, 0, sizeof (bitset_word) * (dsize - ssize1)); }}static boolvbitset_andn_cmp (bitset dst, bitset src1, bitset src2){ unsigned int i; int changed = 0; bitset_word *src1p; bitset_word *src2p; bitset_word *dstp; bitset_windex ssize1; bitset_windex ssize2; bitset_windex dsize; vbitset_resize (dst, max (BITSET_SIZE_ (src1), BITSET_SIZE_ (src2))); dsize = VBITSET_SIZE (dst); ssize1 = VBITSET_SIZE (src1); ssize2 = VBITSET_SIZE (src2); dstp = VBITSET_WORDS (dst); src1p = VBITSET_WORDS (src1); src2p = VBITSET_WORDS (src2); for (i = 0; i < min (ssize1, ssize2); i++, dstp++) { bitset_word tmp = *src1p++ & ~(*src2p++); if (*dstp != tmp) { changed = 1; *dstp = tmp; } } if (ssize2 > ssize1) { for (; i < ssize2; i++, dstp++) { if (*dstp != 0) { changed = 1; *dstp = 0; } } memset (dstp, 0, sizeof (bitset_word) * (dsize - ssize2)); } else { for (; i < ssize1; i++, dstp++) { bitset_word tmp = *src1p++; if (*dstp != tmp) { changed = 1; *dstp = tmp; } } memset (dstp, 0, sizeof (bitset_word) * (dsize - ssize1)); } return changed;}static voidvbitset_or (bitset dst, bitset src1, bitset src2){ unsigned int i; bitset_word *src1p; bitset_word *src2p; bitset_word *dstp; bitset_windex ssize1; bitset_windex ssize2; bitset_windex dsize; vbitset_resize (dst, max (BITSET_SIZE_ (src1), BITSET_SIZE_ (src2))); dsize = VBITSET_SIZE (dst); ssize1 = VBITSET_SIZE (src1); ssize2 = VBITSET_SIZE (src2); dstp = VBITSET_WORDS (dst); src1p = VBITSET_WORDS (src1); src2p = VBITSET_WORDS (src2); for (i = 0; i < min (ssize1, ssize2); i++) *dstp++ = *src1p++ | *src2p++; if (ssize2 > ssize1) { src1p = src2p; ssize1 = ssize2; } for (; i < ssize1; i++) *dstp++ = *src1p++; memset (dstp, 0, sizeof (bitset_word) * (dsize - ssize1));}static boolvbitset_or_cmp (bitset dst, bitset src1, bitset src2){ unsigned int i; int changed = 0; bitset_word *src1p; bitset_word *src2p; bitset_word *dstp; bitset_windex ssize1; bitset_windex ssize2; bitset_windex dsize; vbitset_resize (dst, max (BITSET_SIZE_ (src1), BITSET_SIZE_ (src2))); dsize = VBITSET_SIZE (dst); ssize1 = VBITSET_SIZE (src1); ssize2 = VBITSET_SIZE (src2); dstp = VBITSET_WORDS (dst); src1p = VBITSET_WORDS (src1); src2p = VBITSET_WORDS (src2); for (i = 0; i < min (ssize1, ssize2); i++, dstp++) { bitset_word tmp = *src1p++ | *src2p++; if (*dstp != tmp) { changed = 1; *dstp = tmp; } } if (ssize2 > ssize1) { src1p = src2p; ssize1 = ssize2; } for (; i < ssize1; i++, dstp++) { bitset_word tmp = *src1p++; if (*dstp != tmp) { changed = 1; *dstp = tmp; } } memset (dstp, 0, sizeof (bitset_word) * (dsize - ssize1)); return changed;}static voidvbitset_xor (bitset dst, bitset src1, bitset src2){ unsigned int i; bitset_word *src1p; bitset_word *src2p; bitset_word *dstp; bitset_windex ssize1; bitset_windex ssize2; bitset_windex dsize; vbitset_resize (dst, max (BITSET_SIZE_ (src1), BITSET_SIZE_ (src2))); dsize = VBITSET_SIZE (dst); ssize1 = VBITSET_SIZE (src1); ssize2 = VBITSET_SIZE (src2); dstp = VBITSET_WORDS (dst); src1p = VBITSET_WORDS (src1); src2p = VBITSET_WORDS (src2); for (i = 0; i < min (ssize1, ssize2); i++) *dstp++ = *src1p++ ^ *src2p++; if (ssize2 > ssize1) { src1p = src2p; ssize1 = ssize2; } for (; i < ssize1; i++) *dstp++ = *src1p++; memset (dstp, 0, sizeof (bitset_word) * (dsize - ssize1));}static boolvbitset_xor_cmp (bitset dst, bitset src1, bitset src2){ unsigned int i; int changed = 0; bitset_word *src1p; bitset_word *src2p; bitset_word *dstp; bitset_windex ssize1; bitset_windex ssize2; bitset_windex dsize; vbitset_resize (dst, max (BITSET_SIZE_ (src1), BITSET_SIZE_ (src2))); dsize = VBITSET_SIZE (dst); ssize1 = VBITSET_SIZE (src1); ssize2 = VBITSET_SIZE (src2); dstp = VBITSET_WORDS (dst); src1p = VBITSET_WORDS (src1); src2p = VBITSET_WORDS (src2); for (i = 0; i < min (ssize1, ssize2); i++, dstp++) { bitset_word tmp = *src1p++ ^ *src2p++; if (*dstp != tmp) { changed = 1; *dstp = tmp; } } if (ssize2 > ssize1) { src1p = src2p; ssize1 = ssize2; } for (; i < ssize1; i++, dstp++) { bitset_word tmp = *src1p++; if (*dstp != tmp) { changed = 1; *dstp = tmp; } } memset (dstp, 0, sizeof (bitset_word) * (dsize - ssize1)); return changed;}/* FIXME, these operations need fixing for different size bitsets. */static voidvbitset_and_or (bitset dst, bitset src1, bitset src2, bitset src3){ unsigned int i; bitset_word *src1p; bitset_word *src2p; bitset_word *src3p; bitset_word *dstp; bitset_windex size; if (BITSET_NBITS_ (src1) != BITSET_NBITS_ (src2) || BITSET_NBITS_ (src1) != BITSET_NBITS_ (src3)) { bitset_and_or_ (dst, src1, src2, src3); return; } vbitset_resize (dst, BITSET_NBITS_ (src1)); src1p = VBITSET_WORDS (src1); src2p = VBITSET_WORDS (src2); src3p = VBITSET_WORDS (src3); dstp = VBITSET_WORDS (dst); size = VBITSET_SIZE (dst); for (i = 0; i < size; i++) *dstp++ = (*src1p++ & *src2p++) | *src3p++;}static boolvbitset_and_or_cmp (bitset dst, bitset src1, bitset src2, bitset src3){ unsigned int i; int changed = 0; bitset_word *src1p; bitset_word *src2p; bitset_word *src3p; bitset_word *dstp; bitset_windex size; if (BITSET_NBITS_ (src1) != BITSET_NBITS_ (src2) || BITSET_NBITS_ (src1) != BITSET_NBITS_ (src3)) return bitset_and_or_cmp_ (dst, src1, src2, src3); vbitset_resize (dst, BITSET_NBITS_ (src1)); src1p = VBITSET_WORDS (src1); src2p = VBITSET_WORDS (src2); src3p = VBITSET_WORDS (src3); dstp = VBITSET_WORDS (dst); size = VBITSET_SIZE (dst); for (i = 0; i < size; i++, dstp++) { bitset_word tmp = (*src1p++ & *src2p++) | *src3p++; if (*dstp != tmp) { changed = 1; *dstp = tmp; } } return changed;}static voidvbitset_andn_or (bitset dst, bitset src1, bitset src2, bitset src3){ unsigned int i; bitset_word *src1p; bitset_word *src2p; bitset_word *src3p; bitset_word *dstp; bitset_windex size; if (BITSET_NBITS_ (src1) != BITSET_NBITS_ (src2) || BITSET_NBITS_ (src1) != BITSET_NBITS_ (src3)) { bitset_andn_or_ (dst, src1, src2, src3); return; } vbitset_resize (dst, BITSET_NBITS_ (src1)); src1p = VBITSET_WORDS (src1); src2p = VBITSET_WORDS (src2); src3p = VBITSET_WORDS (src3); dstp = VBITSET_WORDS (dst); size = VBITSET_SIZE (dst); for (i = 0; i < size; i++) *dstp++ = (*src1p++ & ~(*src2p++)) | *src3p++;}static boolvbitset_andn_or_cmp (bitset dst, bitset src1, bitset src2, bitset src3){ unsigned int i; int changed = 0; bitset_word *src1p; bitset_word *src2p; bitset_word *src3p; bitset_word *dstp; bitset_windex size; if (BITSET_NBITS_ (src1) != BITSET_NBITS_ (src2) || BITSET_NBITS_ (src1) != BITSET_NBITS_ (src3)) return bitset_andn_or_cmp_ (dst, src1, src2, src3); vbitset_resize (dst, BITSET_NBITS_ (src1)); src1p = VBITSET_WORDS (src1); src2p = VBITSET_WORDS (src2); src3p = VBITSET_WORDS (src3); dstp = VBITSET_WORDS (dst); size = VBITSET_SIZE (dst); for (i = 0; i < size; i++, dstp++) { bitset_word tmp = (*src1p++ & ~(*src2p++)) | *src3p++; if (*dstp != tmp) { changed = 1; *dstp = tmp; } } return changed;}static voidvbitset_or_and (bitset dst, bitset src1, bitset src2, bitset src3){ unsigned int i; bitset_word *src1p; bitset_word *src2p; bitset_word *src3p; bitset_word *dstp; bitset_windex size; if (BITSET_NBITS_ (src1) != BITSET_NBITS_ (src2) || BITSET_NBITS_ (src1) != BITSET_NBITS_ (src3)) { bitset_or_and_ (dst, src1, src2, src3); return; } vbitset_resize (dst, BITSET_NBITS_ (src1)); src1p = VBITSET_WORDS (src1); src2p = VBITSET_WORDS (src2); src3p = VBITSET_WORDS (src3); dstp = VBITSET_WORDS (dst); size = VBITSET_SIZE (dst); for (i = 0; i < size; i++) *dstp++ = (*src1p++ | *src2p++) & *src3p++;}static boolvbitset_or_and_cmp (bitset dst, bitset src1, bitset src2, bitset src3){ unsigned int i; int changed = 0; bitset_word *src1p; bitset_word *src2p; bitset_word *src3p; bitset_word *dstp; bitset_windex size; if (BITSET_NBITS_ (src1) != BITSET_NBITS_ (src2) || BITSET_NBITS_ (src1) != BITSET_NBITS_ (src3)) return bitset_or_and_cmp_ (dst, src1, src2, src3); vbitset_resize (dst, BITSET_NBITS_ (src1)); src1p = VBITSET_WORDS (src1); src2p = VBITSET_WORDS (src2); src3p = VBITSET_WORDS (src3); dstp = VBITSET_WORDS (dst); size = VBITSET_SIZE (dst); for (i = 0; i < size; i++, dstp++) { bitset_word tmp = (*src1p++ | *src2p++) & *src3p++; if (*dstp != tmp) { changed = 1; *dstp = tmp; } } return changed;}static voidvbitset_copy (bitset dst, bitset src){ if (BITSET_COMPATIBLE_ (dst, src)) vbitset_copy1 (dst, src); else bitset_copy_ (dst, src);}/* Vector of operations for multiple word bitsets. */struct bitset_vtable vbitset_vtable = { vbitset_set, vbitset_reset, bitset_toggle_, vbitset_test, vbitset_resize, bitset_size_, bitset_count_, vbitset_empty_p, vbitset_ones, vbitset_zero, vbitset_copy, vbitset_disjoint_p, vbitset_equal_p, vbitset_not, vbitset_subset_p, vbitset_and, vbitset_and_cmp, vbitset_andn, vbitset_andn_cmp, vbitset_or, vbitset_or_cmp, vbitset_xor, vbitset_xor_cmp, vbitset_and_or, vbitset_and_or_cmp, vbitset_andn_or, vbitset_andn_or_cmp, vbitset_or_and, vbitset_or_and_cmp, vbitset_list, vbitset_list_reverse, NULL, BITSET_VARRAY};size_tvbitset_bytes (n_bits) bitset_bindex n_bits ATTRIBUTE_UNUSED;{ return sizeof (struct vbitset_struct);}bitsetvbitset_init (bset, n_bits) bitset bset; bitset_bindex n_bits;{ bset->b.vtable = &vbitset_vtable; bset->b.cindex = 0; VBITSET_SIZE (bset) = 0; vbitset_resize (bset, n_bits); return bset;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -