Introduce bit_has and use for ∧´, ∨´, and 𝕨∊bool
This commit is contained in:
parent
236d8dedd6
commit
447ce6163f
@ -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;
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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))
|
||||
|
||||
Loading…
Reference in New Issue
Block a user