Introduce bit_has and use for ∧´, ∨´, and 𝕨∊bool

This commit is contained in:
Marshall Lochbaum 2022-10-19 21:09:27 -04:00
parent 236d8dedd6
commit 447ce6163f
3 changed files with 24 additions and 9 deletions

View File

@ -320,8 +320,8 @@ B fold_c1(Md1D* d, B x) { B f = d->f;
u64* xp = bitarr_ptr(x);
if (rtid==n_add) { B r = m_f64(bit_sum (xp, ia)); decG(x); return r; }
if (rtid==n_sub) { B r = m_f64(bit_diff(xp, ia)); decG(x); return r; }
if (rtid==n_and | rtid==n_mul | rtid==n_floor) { bool r=1; for (usz i=0; i<(ia>>6); i++) if (~xp[i]){r=0;break;} if(~bitp_l1(xp,ia))r=0; decG(x); return m_i32(r); }
if (rtid==n_or | rtid==n_ceil ) { bool r=0; for (usz i=0; i<(ia>>6); i++) if ( xp[i]){r=1;break;} if( bitp_l0(xp,ia))r=1; decG(x); return m_i32(r); }
if (rtid==n_and | rtid==n_mul | rtid==n_floor) { B r = m_i32(!bit_has(xp, ia, 0)); decG(x); return r; }
if (rtid==n_or | rtid==n_ceil ) { B r = m_i32( bit_has(xp, ia, 1)); decG(x); return r; }
if (rtid==n_ne) { bool r=fold_ne(xp, ia) ; decG(x); return m_i32(r); }
if (rtid==n_eq) { bool r=fold_ne(xp, ia) ^ (1&~ia); decG(x); return m_i32(r); }
goto base;
@ -383,8 +383,8 @@ B fold_c2(Md1D* d, B w, B x) { B f = d->f;
if (rtid==n_add) { B r = m_f64(wi + bit_sum (xp, ia)); decG(x); return r; }
if (rtid==n_sub) { B r = m_f64((ia&1?-wi:wi) + bit_diff(xp, ia)); decG(x); return r; }
if (wi!=(wi&1)) goto base;
if (rtid==n_and | rtid==n_mul | rtid==n_floor) { bool r=wi; if ( r) { for (usz i=0; i<(ia>>6); i++) if (~xp[i]){r=0;break;} if(~bitp_l1(xp,ia))r=0; } decG(x); return m_i32(r); }
if (rtid==n_or | rtid==n_ceil ) { bool r=wi; if (!r) { for (usz i=0; i<(ia>>6); i++) if ( xp[i]){r=1;break;} if( bitp_l0(xp,ia))r=1; } decG(x); return m_i32(r); }
if (rtid==n_and | rtid==n_mul | rtid==n_floor) { B r = m_i32(wi && !bit_has(xp, ia, 0)); decG(x); return r; }
if (rtid==n_or | rtid==n_ceil ) { B r = m_i32(wi || bit_has(xp, ia, 1)); decG(x); return r; }
if (rtid==n_ne) { bool r=wi^fold_ne(xp, ia) ; decG(x); return m_i32(r); }
if (rtid==n_eq) { bool r=wi^fold_ne(xp, ia) ^ (1&ia); decG(x); return m_i32(r); }
goto base;

View File

@ -84,14 +84,23 @@ B memberOf_c2(B t, B w, B x) {
many: {
u8 we = TI(w,elType); usz wia = IA(w);
u8 xe = TI(x,elType); usz xia = IA(x);
if (xia == 0) { Arr* ba=allZeroes(wia); arr_shVec(ba); r=taga(ba); decG(w); goto dec_x; }
#define WEQ(V) eq_c2(m_f64(0), inc(w), V)
if (xe==el_bit) {
u64* xp = bitarr_ptr(x);
u64 x0 = 1 & xp[0];
r = WEQ(m_usz(x0));
if (bit_has(xp, xia, !x0)) r = or_c2(m_f64(0), r, WEQ(m_usz(!x0)));
decG(w); goto dec_x;
}
if (xia<=16 && wia>16 && we<el_B && xe<el_B) {
SGetU(x);
Arr* ba=allZeroes(wia); arr_shVec(ba); r=taga(ba);
for (usz i=0; i<xia; i++) r = or_c2(m_f64(0), r, eq_c2(m_f64(0), inc(w), GetU(x,i)));
decG(w);
goto dec_x;
r = WEQ(GetU(x,0));
for (usz i=1; i<xia; i++) r = or_c2(m_f64(0), r, WEQ(GetU(x,i)));
decG(w); goto dec_x;
}
// TODO O(wia×xia) for small wia or xia
#undef WEQ
// TODO O(wia×xia) for small wia
H_Sb* set = m_Sb(64);
SGetU(x) SGetU(w)
bool had;

View File

@ -42,6 +42,12 @@ static inline u64 bitp_l1(u64* arr, u64 ia) { // last u64 of the array, with the
static inline u64 bitx(B x) { // repeats the boolean across all 64 bits
return o2bG(x)? ~(u64)0 : 0;
}
static inline bool bit_has(u64* arr, u64 ia, bool v) {
u64 w = ~-(u64)v;
u64 e = ia/64, q = ia%64;
for (usz i=0; i<e; i++) if (arr[i]^w) return 1;
return q && ((arr[e]^w) & ((1ULL<<q)-1));
}
// BitArr
#define BITARR_SZ(IA) fsizeof(BitArr, a, u64, BIT_N(IA))