博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
__int128的实现
阅读量:5056 次
发布时间:2019-06-12

本文共 3369 字,大约阅读时间需要 11 分钟。

#include
#include
#include
#include
#include
#include
using namespace std; class int128; void shift(int128 & in,deque
& de); template
bool operator<(bitset
const& b1,bitset
const& b2) { int i=N; while( i-- && b1[i]==b2[i] ) { } return ((-1 == i) ? false : (b1[i]
number; public: explicit int128(string str):number(str){} int128(bitset<128>const& b):number(b){} int128(int a = 0 , int b = 0 , int c = 0 , int d = 0) { bitset<32> b1(a),b2(b),b3(c),b4(d); int i, k = 128; for(i = 32 ; i ; number[--k] = b1[--i]) { } for(i = 32 ; i ; number[--k] = b2[--i]) { } for(i = 32 ; i ; number[--k] = b3[--i]) { } for(i = 32 ; i ; number[--k] = b4[--i]) { } } bool operator[](size_t i)const { return number[i]; } bitset<128>::reference operator[](size_t i) { return number[i]; } friend bool operator<(int128 const& i1,int128 const& i2) { return i1.number < i2.number; } friend int128 operator+(int128 const& i1,int128 const& i2) { if(i1 == 0) return i2; if(i2 == 0) return i1; int128 result; bitset<2> sum; for(int i = 0 ; i < 128 ; ++i) { sum=i1[i]+i2[i]+sum.to_ulong(); result[i]=sum[0]; sum>>=1; } return result; } friend int128 operator-(int128 const& i1,int128 const& i2) { if(i2==0) return i1; int128 result=i1; for(int i = 0 ; i < 128 ; ++i) { if(i2[i] == 0) {} else { if(result[i] == 1) result[i] = 0; else { int k = i; while(k < 128 && result[k] == 0) { result[k] = 1; ++k; } if(k != 128) result[k] = 0; } } } return result; } friend int128 operator*(int128 const& i1,int128 const& i2) { if(i1==0 || i2==0) return int128(); if(i1==1) return i2; if(i2==1) return i1; int128 acc=int128(); for(int i=0;i<128;++i) { if(i2[i]==1) { acc=acc+(i1<
de; bool flag = 0; for(int i = 127 ; i >= 0 ; --i) { if(flag == 0 && i1[i] == 0) {} else { flag = 1; de.push_back(i1[i]); } } int128 div = int128(); int128 result = int128(); while(!de.empty()) { shift(div,de); if(div < i2) { result = result<<1; } else { result = (result<<1) + int128(0,0,0,1); div = div - i2; } } return result; } friend int128 operator%(int128 const& i1,int128 const& i2) { if(i1 < i2) return i1; deque
de; bool flag = 0; for(int i = 127 ; i >= 0 ; --i) { if(flag == 0 && i1[i] == 0) {} else { flag = 1; de.push_back(i1[i]); } } int128 div = int128(); int128 result = int128(); while(!de.empty()) { shift(div,de); if(div < i2) { result = result<<1; } else { result = (result<<1) + int128(0,0,0,1); div = div - i2; } } return div; } friend bool operator==(int128 const& i,int const k) { bitset<32> bb(k); for(int g = 0 ; g < 32 ; ++g) { if(i[g] != bb[g]) return 0; } return 1; } void operator=(bitset<128>const& b) { number = b; } friend ostream& operator<<(ostream& o,int128 const& i) { o<
void add_one(bitset
& b) { int i = 0; while(i < N && b[i] == 1) { b[i] = 0; ++i; } if(i == N) return; b[i] = 1; } void add_one(int128& k) { int i = 0; while(i < 128 && k[i] == 1) { k[i] = 0; ++i; } if(i == 128) return; k[i] = 1; } void shift(int128 & in,deque
& de) { if(de.front()==1) { de.pop_front(); in=(in<<1)+one; } else { de.pop_front(); in=in<<1; } } bool IsPrime(int128 const& number) { for(int128 i = int128(0,0,0,2) ; i < number ; add_one(i)) { if(number%i == 0) return 0; } return 1; }

  这个是某dalao写的int128类,可能不是那么好用,暂存,回家搞一点事情。

转载于:https://www.cnblogs.com/TheRoadToAu/p/8414622.html

你可能感兴趣的文章
如何增强你的SharePoint 团队网站首页
查看>>
FZU 1914 Funny Positive Sequence(线性算法)
查看>>
oracle 报错ORA-12514: TNS:listener does not currently know of service requested in connec
查看>>
基于grunt构建的前端集成开发环境
查看>>
MySQL服务读取参数文件my.cnf的规律研究探索
查看>>
java string(转)
查看>>
__all__有趣的属性
查看>>
BZOJ 5180 [Baltic2016]Cities(斯坦纳树)
查看>>
写博客
查看>>
利用循环播放dataurl的视频来防止锁屏:NoSleep.js
查看>>
python3 生成器与迭代器
查看>>
java编写提升性能的代码
查看>>
ios封装静态库技巧两则
查看>>
Educational Codeforces Round 46 (Rated for Div. 2)
查看>>
Abstract Factory Pattern
查看>>
C# 实现Bresenham算法(vs2010)
查看>>
基于iSCSI的SQL Server 2012群集测试(一)--SQL群集安装
查看>>
list 容器 排序函数.xml
查看>>
存储开头结尾使用begin tran,rollback tran作用?
查看>>
Activity启动过程中获取组件宽高的五种方式
查看>>