📄 vlrt.c
字号:
typedef unsigned long ulong;typedef unsigned int uint;typedef unsigned short ushort;typedef unsigned char uchar;typedef signed char schar;#define SIGN(n) (1UL<<(n-1))typedef struct Vlong Vlong;struct Vlong{ union { struct { ulong lo; ulong hi; }; struct { ushort lols; ushort loms; ushort hils; ushort hims; }; };};void abort(void);void_subv(Vlong *r, Vlong a, Vlong b){ ulong lo, hi; lo = a.lo - b.lo; hi = a.hi - b.hi; if(lo > a.lo) hi--; r->lo = lo; r->hi = hi;}void_d2v(Vlong *y, double d){ union { double d; struct Vlong; } x; ulong xhi, xlo, ylo, yhi; int sh; x.d = d; xhi = (x.hi & 0xfffff) | 0x100000; xlo = x.lo; sh = 1075 - ((x.hi >> 20) & 0x7ff); ylo = 0; yhi = 0; if(sh >= 0) { /* v = (hi||lo) >> sh */ if(sh < 32) { if(sh == 0) { ylo = xlo; yhi = xhi; } else { ylo = (xlo >> sh) | (xhi << (32-sh)); yhi = xhi >> sh; } } else { if(sh == 32) { ylo = xhi; } else if(sh < 64) { ylo = xhi >> (sh-32); } } } else { /* v = (hi||lo) << -sh */ sh = -sh; if(sh <= 10) { ylo = xlo << sh; yhi = (xhi << sh) | (xlo >> (32-sh)); } else { /* overflow */ yhi = d; /* causes something awful */ } } if(x.hi & SIGN(32)) { if(ylo != 0) { ylo = -ylo; yhi = ~yhi; } else yhi = -yhi; } y->hi = yhi; y->lo = ylo;}void_f2v(Vlong *y, float f){ _d2v(y, f);}double_v2d(Vlong x){ if(x.hi & SIGN(32)) { if(x.lo) { x.lo = -x.lo; x.hi = ~x.hi; } else x.hi = -x.hi; return -((long)x.hi*4294967296. + x.lo); } return (long)x.hi*4294967296. + x.lo;}float_v2f(Vlong x){ return _v2d(x);}ulong _div64by32(Vlong, ulong, ulong*);void _mul64by32(Vlong*, Vlong, ulong);static voiddodiv(Vlong num, Vlong den, Vlong *qp, Vlong *rp){ ulong n; Vlong x, q, r; if(den.hi > num.hi || (den.hi == num.hi && den.lo > num.lo)){ if(qp) { qp->hi = 0; qp->lo = 0; } if(rp) { rp->hi = num.hi; rp->lo = num.lo; } return; } if(den.hi != 0){ q.hi = 0; n = num.hi/den.hi; _mul64by32(&x, den, n); if(x.hi > num.hi || (x.hi == num.hi && x.lo > num.lo)){ n--; _mul64by32(&x, den, n); } q.lo = n; _subv(&r, num, x); } else { if(num.hi >= den.lo){ q.hi = n = num.hi/den.lo; num.hi -= den.lo*n; } else { q.hi = 0; } q.lo = _div64by32(num, den.lo, &r.lo); r.hi = 0; } if(qp) { qp->lo = q.lo; qp->hi = q.hi; } if(rp) { rp->lo = r.lo; rp->hi = r.hi; }}void_divvu(Vlong *q, Vlong n, Vlong d){ if(n.hi == 0 && d.hi == 0) { q->hi = 0; q->lo = n.lo / d.lo; return; } dodiv(n, d, q, 0);}void_modvu(Vlong *r, Vlong n, Vlong d){ if(n.hi == 0 && d.hi == 0) { r->hi = 0; r->lo = n.lo % d.lo; return; } dodiv(n, d, 0, r);}static voidvneg(Vlong *v){ if(v->lo == 0) { v->hi = -v->hi; return; } v->lo = -v->lo; v->hi = ~v->hi;}void_divv(Vlong *q, Vlong n, Vlong d){ long nneg, dneg; if(n.hi == (((long)n.lo)>>31) && d.hi == (((long)d.lo)>>31)) { q->lo = (long)n.lo / (long)d.lo; q->hi = ((long)q->lo) >> 31; return; } nneg = n.hi >> 31; if(nneg) vneg(&n); dneg = d.hi >> 31; if(dneg) vneg(&d); dodiv(n, d, q, 0); if(nneg != dneg) vneg(q);}void_modv(Vlong *r, Vlong n, Vlong d){ long nneg, dneg; if(n.hi == (((long)n.lo)>>31) && d.hi == (((long)d.lo)>>31)) { r->lo = (long)n.lo % (long)d.lo; r->hi = ((long)r->lo) >> 31; return; } nneg = n.hi >> 31; if(nneg) vneg(&n); dneg = d.hi >> 31; if(dneg) vneg(&d); dodiv(n, d, 0, r); if(nneg) vneg(r);}void_rshav(Vlong *r, Vlong a, int b){ long t; t = a.hi; if(b >= 32) { r->hi = t>>31; if(b >= 64) { /* this is illegal re C standard */ r->lo = t>>31; return; } r->lo = t >> (b-32); return; } if(b <= 0) { r->hi = t; r->lo = a.lo; return; } r->hi = t >> b; r->lo = (t << (32-b)) | (a.lo >> b);}void_rshlv(Vlong *r, Vlong a, int b){ ulong t; t = a.hi; if(b >= 32) { r->hi = 0; if(b >= 64) { /* this is illegal re C standard */ r->lo = 0; return; } r->lo = t >> (b-32); return; } if(b <= 0) { r->hi = t; r->lo = a.lo; return; } r->hi = t >> b; r->lo = (t << (32-b)) | (a.lo >> b);}void_lshv(Vlong *r, Vlong a, int b){ ulong t; t = a.lo; if(b >= 32) { r->lo = 0; if(b >= 64) { /* this is illegal re C standard */ r->hi = 0; return; } r->hi = t << (b-32); return; } if(b <= 0) { r->lo = t; r->hi = a.hi; return; } r->lo = t << b; r->hi = (t >> (32-b)) | (a.hi << b);}void_andv(Vlong *r, Vlong a, Vlong b){ r->hi = a.hi & b.hi; r->lo = a.lo & b.lo;}void_orv(Vlong *r, Vlong a, Vlong b){ r->hi = a.hi | b.hi; r->lo = a.lo | b.lo;}void_xorv(Vlong *r, Vlong a, Vlong b){ r->hi = a.hi ^ b.hi; r->lo = a.lo ^ b.lo;}void_vpp(Vlong *l, Vlong *r){ l->hi = r->hi; l->lo = r->lo; r->lo++; if(r->lo == 0) r->hi++;}void_vmm(Vlong *l, Vlong *r){ l->hi = r->hi; l->lo = r->lo; if(r->lo == 0) r->hi--; r->lo--;}void_ppv(Vlong *l, Vlong *r){ r->lo++; if(r->lo == 0) r->hi++; l->hi = r->hi; l->lo = r->lo;}void_mmv(Vlong *l, Vlong *r){ if(r->lo == 0) r->hi--; r->lo--; l->hi = r->hi; l->lo = r->lo;}void_vasop(Vlong *ret, void *lv, void fn(Vlong*, Vlong, Vlong), int type, Vlong rv){ Vlong t, u; u.lo = 0; u.hi = 0; switch(type) { default: abort(); break; case 1: /* schar */ t.lo = *(schar*)lv; t.hi = t.lo >> 31; fn(&u, t, rv); *(schar*)lv = u.lo; break; case 2: /* uchar */ t.lo = *(uchar*)lv; t.hi = 0; fn(&u, t, rv); *(uchar*)lv = u.lo; break; case 3: /* short */ t.lo = *(short*)lv; t.hi = t.lo >> 31; fn(&u, t, rv); *(short*)lv = u.lo; break; case 4: /* ushort */ t.lo = *(ushort*)lv; t.hi = 0; fn(&u, t, rv); *(ushort*)lv = u.lo; break; case 9: /* int */ t.lo = *(int*)lv; t.hi = t.lo >> 31; fn(&u, t, rv); *(int*)lv = u.lo; break; case 10: /* uint */ t.lo = *(uint*)lv; t.hi = 0; fn(&u, t, rv); *(uint*)lv = u.lo; break; case 5: /* long */ t.lo = *(long*)lv; t.hi = t.lo >> 31; fn(&u, t, rv); *(long*)lv = u.lo; break; case 6: /* ulong */ t.lo = *(ulong*)lv; t.hi = 0; fn(&u, t, rv); *(ulong*)lv = u.lo; break; case 7: /* vlong */ case 8: /* uvlong */ fn(&u, *(Vlong*)lv, rv); *(Vlong*)lv = u; break; } *ret = u;}void_p2v(Vlong *ret, void *p){ long t; t = (ulong)p; ret->lo = t; ret->hi = 0;}void_sl2v(Vlong *ret, long sl){ long t; t = sl; ret->lo = t; ret->hi = t >> 31;}void_ul2v(Vlong *ret, ulong ul){ long t; t = ul; ret->lo = t; ret->hi = 0;}void_si2v(Vlong *ret, int si){ long t; t = si; ret->lo = t; ret->hi = t >> 31;}void_ui2v(Vlong *ret, uint ui){ long t; t = ui; ret->lo = t; ret->hi = 0;}void_sh2v(Vlong *ret, long sh){ long t; t = (sh << 16) >> 16; ret->lo = t; ret->hi = t >> 31;}void_uh2v(Vlong *ret, ulong ul){ long t; t = ul & 0xffff; ret->lo = t; ret->hi = 0;}void_sc2v(Vlong *ret, long uc){ long t; t = (uc << 24) >> 24; ret->lo = t; ret->hi = t >> 31;}void_uc2v(Vlong *ret, ulong ul){ long t; t = ul & 0xff; ret->lo = t; ret->hi = 0;}long_v2sc(Vlong rv){ long t; t = rv.lo & 0xff; return (t << 24) >> 24;}long_v2uc(Vlong rv){ return rv.lo & 0xff;}long_v2sh(Vlong rv){ long t; t = rv.lo & 0xffff; return (t << 16) >> 16;}long_v2uh(Vlong rv){ return rv.lo & 0xffff;}long_v2sl(Vlong rv){ return rv.lo;}long_v2ul(Vlong rv){ return rv.lo;}long_v2si(Vlong rv){ return rv.lo;}long_v2ui(Vlong rv){ return rv.lo;}int_testv(Vlong rv){ return rv.lo || rv.hi;}int_eqv(Vlong lv, Vlong rv){ return lv.lo == rv.lo && lv.hi == rv.hi;}int_nev(Vlong lv, Vlong rv){ return lv.lo != rv.lo || lv.hi != rv.hi;}int_ltv(Vlong lv, Vlong rv){ return (long)lv.hi < (long)rv.hi || (lv.hi == rv.hi && lv.lo < rv.lo);}int_lev(Vlong lv, Vlong rv){ return (long)lv.hi < (long)rv.hi || (lv.hi == rv.hi && lv.lo <= rv.lo);}int_gtv(Vlong lv, Vlong rv){ return (long)lv.hi > (long)rv.hi || (lv.hi == rv.hi && lv.lo > rv.lo);}int_gev(Vlong lv, Vlong rv){ return (long)lv.hi > (long)rv.hi || (lv.hi == rv.hi && lv.lo >= rv.lo);}int_lov(Vlong lv, Vlong rv){ return lv.hi < rv.hi || (lv.hi == rv.hi && lv.lo < rv.lo);}int_lsv(Vlong lv, Vlong rv){ return lv.hi < rv.hi || (lv.hi == rv.hi && lv.lo <= rv.lo);}int_hiv(Vlong lv, Vlong rv){ return lv.hi > rv.hi || (lv.hi == rv.hi && lv.lo > rv.lo);}int_hsv(Vlong lv, Vlong rv){ return lv.hi > rv.hi || (lv.hi == rv.hi && lv.lo >= rv.lo);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -