对内存32字节的数据,也就是256位,以5位分割,计算其整形数值,如11111计算为31,
直到计算到250既可以,一共计算出50个整形保存到数组中,32字节是随机的,在内存中
都是0或1.限C语言实现。
你这个,我姑且理解为大整数除法和求余数,我之前刚好写过一个大整数类,贴出代码你看一下:
这样你可以声明一个大数,然后不断除32算余数和商
声明部分
#define MAXN 9999
#define MAXSIZE 10
#define DLEN 4
class HugeInt
{
private:
int a[500]; //可以控制大数的位数
int len; //大数长度
bool sign;
public:
HugeInt(){ len = 1; memset(a, 0, sizeof(a)); } //构造函数
HugeInt(const int); //将一个int类型的变量转化为大数
HugeInt(const char*); //将一个字符串类型的变量转化为大数
HugeInt operator/(const int &) const; //重载除法运算符,大数对一个整数进行相除运算
int operator%(const int &) const; //大数对一个int类型的变量进行取模运算
函数部分:
HugeInt::HugeInt(const char*s) //将一个字符串类型的变量转化为大数
{
int t, k, index, l, i;
memset(a, 0, sizeof(a));
l = strlen(s);
if (s[0] == '-')
{
sign = false;
}
else sign = true;
len = l / DLEN;
if (l%DLEN)
len++;
index = 0;
int end = 0;
for (i = l - 1; i >= 0; i -= DLEN)
{
t = 0;
k = i - DLEN + 1;
if (k<0)
k = 0;
for (int j = k; j <= i; j++)
{
if (s[j] == '-')
{
t = 0;
end = 1;
}
else
{
t = t * 10 + s[j] - '0';
}
}
if (end == 1 && t == 0)
{
len--;
return;
}
a[index++] = t;
}
}
HugeInt HugeInt::operator/(const int & b) const //大数对一个整数进行相除运算
{
HugeInt ret;
if (b == 0) return ret;
bool bsign = true;
if (b < 0) bsign = false;
if (sign == bsign) ret.sign = true;
else ret.sign = false;
int d = abs(b);
int i, down = 0;
for (i = len - 1; i >= 0; i--)
{
ret.a[i] = (a[i] + down * (MAXN + 1)) / d;
down = a[i] + down * (MAXN + 1) - ret.a[i] * d;
}
ret.len = len;
while (ret.a[ret.len - 1] == 0 && ret.len > 1)
ret.len--;
return ret;
}
int HugeInt::operator %(const int & b) const //大数对一个int类型的变量进行取模运算
{
int i, d = 0;
if (b == 0) return d;
for (i = len - 1; i >= 0; i--)
{
d = ((d * (MAXN + 1)) % b + a[i]) % b;
}
if (!sign) d = -d;
return d;
}
整数最大只能表示4个字节(32位)。你256位,要么就还是用数组保存着,要么转换成字符串。否则没办法表示。
uchar b[32];//32字节的数据
unsigned int p= (int)b;
int buf[50]=0;
for(i =0 ; i buf[i]= (p[i/8]>>((i%8)*5))&0x1f;
}