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

求内存数据转整形的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;
    }
    
    
    已采纳该答案
    打赏 评论
  • threenewbee 2018-06-07 04:18

    整数最大只能表示4个字节(32位)。你256位,要么就还是用数组保存着,要么转换成字符串。否则没办法表示。

    打赏 评论
  • 视频小哥 2018-06-08 02:36

    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;
    }

    打赏 评论

相关推荐 更多相似问题