BigInt.hpp 924 B

123456789101112131415161718192021222324252627282930313233343536
  1. #ifndef BIG_INT_HPP
  2. #define BIG_INT_HPP
  3. #include "semi_bitset.hpp"
  4. template<std::size_t size>
  5. class BigInt{
  6. private:
  7. int signum = 1;
  8. semi_bitset<size, size >= 1000> bits;
  9. public:
  10. inline BigInt(){
  11. }
  12. inline BigInt(int o){
  13. if(o < 0){signum = -1;o *= -1;}
  14. bits.data[bits.length() - 1] = (unsigned int)o;
  15. }
  16. inline BigInt(unsigned int o){
  17. bits.data[bits.length() - 1] = o;
  18. }
  19. inline BigInt(long long o){
  20. if(o < 0){signum = -1;o *= -1;}
  21. bits.data[bits.length() - 1] = (lower_half);
  22. bits.data[bits.length() - 2] = (o >> 32);
  23. }
  24. inline BigInt(unsigned long long o){
  25. bits.data[bits.length() - 1] = (o & lower_half);
  26. bits.data[bits.length() - 2] = (o >> 32);
  27. }
  28. template<typename stream, size_t osize>
  29. inline friend stream& operator<<(stream& s, const BigInt<osize>& o){
  30. for(size_t i = 0;i < o.bits.length();i++)
  31. s << std::bitset<32>((uint32_t)(o.bits.data[i] & lower_half));
  32. return s;
  33. }
  34. };
  35. #endif