Advertisement
Guest User

Untitled

a guest
Aug 23rd, 2019
128
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.61 KB | None | 0 0
  1. #include <string>
  2. #include <iostream>
  3. #define max(a, b) ((a) > (b) ? (a) : (b))
  4. #define min(a, b) ((a) < (b) ? (a) : (b))
  5.  
  6. typedef unsigned int bigint_unit;
  7. typedef unsigned long long int bigint_buffer;
  8. const bigint_buffer HALF_MASK = 0x00000000ffffffff;
  9.  
  10. class bigint_result_buffer
  11. {
  12. protected:
  13.     bigint_unit *arr;
  14.     int size;
  15.     int nint;
  16.     int cut_size;
  17.  
  18.     void cut() { arr[nint - 1] &= ~(0xffffffff << cut_size); }
  19. };
  20.  
  21. class bigint : bigint_result_buffer
  22. {
  23. public:
  24.     bigint(int size)
  25.     {
  26.         this->size = size;
  27.         cut_size = size % sizeof(bigint_unit);
  28.         nint = size / sizeof(bigint_unit) + (cut_size ? 1 : 0);
  29.         arr = new bigint_unit[nint];
  30.         *this = 0;
  31.         this->cut();
  32.     }
  33.  
  34.     int get_size() { return size; }
  35.     int get_nint() { return nint; }
  36.     bigint_unit get_arr(int n) { return (n < nint ? arr[n] : 0); }
  37.  
  38.     bigint operator= (bigint src)
  39.     {
  40.         memcpy(this->arr, src.arr, min(this->nint, src.nint));
  41.         for (int i = src.nint; i < this->nint; i++)
  42.             this->arr[i] = 0;
  43.         this->cut();
  44.         return *this;
  45.     }
  46.  
  47.     bigint operator= (long long int src)
  48.     {
  49.         arr[0] = src & HALF_MASK;
  50.         if (nint > 1)
  51.             arr[1] = src >> 32;
  52.         for (int i = 2; i < nint; i++)
  53.             arr[i] = 0;
  54.         this->cut();
  55.         return *this;//*this;
  56.     }
  57.  
  58.  
  59.     bigint operator+(bigint a)
  60.     {
  61.         bigint res(max(this->size, a.size));
  62.         bigint_buffer buffer;
  63.         int space = max(this->nint, a.nint);
  64.         int n = min(this->size, a.size);
  65.         int i;
  66.  
  67.         res.arr[0] = 0;
  68.         for (i = 0; i < n; i++)
  69.         {
  70.             buffer = this->arr[i] + a.arr[i];
  71.             res.arr[i] += buffer & HALF_MASK;
  72.             if (space > i + 1)
  73.                 res.arr[i + 1] = buffer >> 32;
  74.         }
  75.         for (i++; i < space; i++)
  76.             res.arr[i] = 0;
  77.  
  78.         res.cut();
  79.         return res;
  80.     }
  81.  
  82.     bigint operator+(long long int s)
  83.     {
  84.         bigint res(1);
  85.         res = *this;
  86.         int a = s & HALF_MASK;
  87.         int b = s >> 32;
  88.  
  89.         s = res.arr[0] + a;
  90.         res.arr[0] = s & HALF_MASK;
  91.         if (nint > 1)
  92.         {
  93.             s = res.arr[1] + b + (s >> 32);
  94.             res.arr[1] = s & HALF_MASK;
  95.         }
  96.         if (nint > 2)
  97.         {
  98.             s = res.arr[2] + s >> 32;
  99.             res.arr[1] = s & HALF_MASK;
  100.         }
  101.         res.cut();
  102.         return res;
  103.     }
  104.  
  105.     ~bigint() { delete[] arr; }
  106.  
  107. private:
  108.     static bigint_result_buffer result_buffer;
  109.    
  110. //  inline void signing( )
  111. };
  112.  
  113.  
  114. void print_arr(bigint b)
  115. {
  116.     for (int i = 0; i < b.get_nint(); i++)
  117.         std::cout << b.get_arr(i) << std::endl;
  118. }
  119.  
  120.  
  121. using namespace std;
  122. int main()
  123. {
  124.     //bigint b(16);
  125.     //long long a = UINT_MAX;
  126.  
  127.     //b = b + a;
  128.  
  129.     //print_arr(b);
  130.     //b = b + a;
  131.  
  132.     //print_arr(b);
  133.  
  134.     //cout << sizeof(bigint) << endl << sizeof(bigint_result_buffer) << endl;
  135.     bigint b(16);
  136.     int a = 2;
  137.     b = a;
  138.     print_arr(b);
  139.    
  140.     getchar();
  141.     return 0;
  142. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement