青青世界 2018-06-07 01:30 采纳率: 33.3%
浏览 645
已采纳

求内存数据转整形的c算法

对内存32字节的数据,也就是256位,以5位分割,计算其整形数值,如11111计算为31,
直到计算到250既可以,一共计算出50个整形保存到数组中,32字节是随机的,在内存中
都是0或1.限C语言实现。

  • 写回答

3条回答 默认 最新

  • 白色一大坨 2018-06-08 04:46
    关注

    你这个,我姑且理解为大整数除法和求余数,我之前刚好写过一个大整数类,贴出代码你看一下:
    这样你可以声明一个大数,然后不断除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;
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥15 怎么把多于硬盘空间放到根目录下
  • ¥15 Matlab问题解答有两个问题
  • ¥50 Oracle Kubernetes服务器集群主节点无法访问,工作节点可以访问
  • ¥15 LCD12864中文显示
  • ¥15 在使用CH341SER.EXE时不小心把所有驱动文件删除了怎么解决
  • ¥15 gsoap生成onvif框架
  • ¥15 有关sql server business intellige安装,包括SSDT、SSMS。
  • ¥15 stm32的can接口不能收发数据
  • ¥15 目标检测算法移植到arm开发板
  • ¥15 利用JD51设计温度报警系统