青青世界 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 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 保护模式-系统加载-段寄存器