⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ibit.c

📁 Arithmetic for integers of almost unlimited size for C and C++. Developed and copyrighted by Ra
💻 C
字号:
/* Integer Version 2.1, TP, 5.10.94     ibit.c */#include <iint.h>#include <imem.h>#define RADIXMINUSONE    ((DigitType)(-1))#define BPDM1            (BitsPerDigit-1)#define RADIXHALF        ((DigitType)(1UL<<BPDM1))voidIasnotI(b, a)    pInteger b;    const Integer *a;{				/* b = ~a */    register long lb, i;    register DigitType h, r;    if (!a->length)    {	Ias1(b);	return;    }    IasI(b, a);    lb = b->length;    for (i = lb - 2; i >= 0; i--)	b->vec[i] = (~(b->vec[i]) & RADIXMINUSONE);    h = RADIXHALF;    r = RADIXMINUSONE;    while (!((b->vec[lb - 1]) & h))    {	h >>= 1;	r >>= 1;    }    b->vec[lb - 1] = ((~(b->vec[lb - 1])) & r);    lb = lb - 1;    while ((lb >= 0) && (!(b->vec[lb])))	lb--;    b->length = lb + 1;    b->sign = (b->sign && b->vec[0]);}voidIandasI(c, a)    pInteger c;    const Integer *a;{				/* c &= a */    IasIandI(c, c, a);}voidIasIandI(c, a, b)    pInteger c;    const Integer *a;    const Integer *b;{				/* c = a & b */    register int la;    register int lb;    register int lm;    register int i;    register int neededlength;    if (!a->length || !b->length)    {	Ias0(c);	return;    }    la = a->length;    lb = b->length;    lm = (la > lb ? lb : la);    neededlength = lm;    if (neededlength > c->maxlength)    {	register DigitType *newv;	register int oldlength = c->maxlength;	c->maxlength = neededlength;	newv = newDigitVec(&c->maxlength);	for (i = 0; i < lm; i++)	    newv[i] = a->vec[i] & b->vec[i];	delDigitVec(c->vec, oldlength);	c->vec = newv;    }    else    {	for (i = 0; i < lm; i++)	    c->vec[i] = a->vec[i] & b->vec[i];    }    lm = lm - 1;    while ((lm >= 0) && (!(c->vec[lm])))	lm--;    c->length = lm + 1;    c->sign = PLUS;}voidIxorasI(c, a)    pInteger c;    const Integer *a;{				/* c ^= a */    IasIxorI(c, c, a);}voidIasIxorI(c, a, b)    pInteger c;    const Integer *a;    const Integer *b;{				/* c = a ^ b */    register long la;    register long lb;    register long sm;    register long lm;    register long i;    register int neededlength;    if (!a->length)    {	IasI(c, b);	c->sign = PLUS;	return;    }    if (!b->length)    {	IasI(c, a);	c->sign = PLUS;	return;    }    la = a->length;    lb = b->length;    if (la > lb)    {	lm = la;	sm = lb;    }    else    {	lm = lb;	sm = la;    }    neededlength = lm;    if (neededlength > c->maxlength)    {	register DigitType *newv;	register int oldlength = c->maxlength;	c->maxlength = neededlength;	newv = newDigitVec(&c->maxlength);	for (i = 0; i < sm; i++)	    newv[i] = a->vec[i] ^ b->vec[i];	if (la > lb)	    for (; i < lm; i++)		newv[i] = a->vec[i];	else	    for (; i < lm; i++)		newv[i] = b->vec[i];	delDigitVec(c->vec, oldlength);	c->vec = newv;    }    else    {	for (i = 0; i < sm; i++)	    c->vec[i] = a->vec[i] ^ b->vec[i];	if (la > lb)	    for (; i < lm; i++)		c->vec[i] = a->vec[i];	else	    for (; i < lm; i++)		c->vec[i] = b->vec[i];    }    lm = lm - 1;    while ((lm >= 0) && (!(c->vec[lm])))	lm--;    c->length = lm + 1;    c->sign = PLUS;}voidIorasI(c, a)    pInteger c;    const Integer *a;{				/* c |= a */    IasIorI(c, c, a);}voidIasIorI(c, a, b)    pInteger c;    const Integer *a;    const Integer *b;{				/* c = a | b */    register long la;    register long lb;    register long sm;    register long lm;    register long i;    register int neededlength;    if (!a->length)    {	IasI(c, b);	c->sign = PLUS;	return;    }    if (!b->length)    {	IasI(c, a);	c->sign = PLUS;	return;    }    la = a->length;    lb = b->length;    if (la > lb)    {	lm = la;	sm = lb;    }    else    {	lm = lb;	sm = la;    }    neededlength = lm;    if (neededlength > c->maxlength)    {	register DigitType *newv;	register int oldlength = c->maxlength;	c->maxlength = neededlength;	newv = newDigitVec(&c->maxlength);	for (i = 0; i < sm; i++)	    newv[i] = a->vec[i] | b->vec[i];	if (la > lb)	    for (; i < lm; i++)		newv[i] = a->vec[i];	else	    for (; i < lm; i++)		newv[i] = b->vec[i];	delDigitVec(c->vec, oldlength);	c->vec = newv;    }    else    {	for (i = 0; i < sm; i++)	    c->vec[i] = a->vec[i] | b->vec[i];	if (la > lb)	    for (; i < lm; i++)		c->vec[i] = a->vec[i];	else	    for (; i < lm; i++)		c->vec[i] = b->vec[i];    }    c->length = lm;    c->sign = PLUS;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -