C/C++中int128的那点事
最近群友对int128这个东西讨论的热火朝天的。讲道理的话,编译器的gcc是不支持__int128这种数据类型的,比如在codeblocks 16.01/Dev C++是无法编译的,但是提交到大部分OJ上是可以编译且能用的。C/C++标准。IO是不认识__int128这种数据类型的,因此要自己实现IO,其他的运算,与int没有什么不同。
但是官方上写了GCC提供了两种128位整数类型,分别是__int128_t和__uint128_t,分别用于声明有符号整数变量和无符号整数变量。
有关GCC的文档参见:Using the GNU Compiler Collection (GCC)。
这里给出了样例程序,是有关类型__int128_t和__uint128_t的。从计算可以看出,这两个类型都是16字节的,类型__uint128_t是128位的。程序中使用了按位取反运算,移位运算和乘法运算。
由于这种大整数无法使用函数printf()输出其值,所以自己做了一个整数转字符串函数myitoa(),用于实现128位整数的输出。
有兴趣的同学想了解底层实现原理可以参看我的Github上:https://github.com/AngelKitty/English-Version-CHSInt128
代码实现如下:
1 #include <iostream> 2 3 using namespace std; 4 5 void myitoa(__int128_t v, char* s) 6 { 7 char temp; 8 int i=0, j; 9 10 while(v >0) { 11 s[i++] = v % 10 + '0'; 12 v /= 10; 13 } 14 s[i] = '\0'; 15 16 j=0; 17 i--; 18 while(j < i) { 19 temp = s[j]; 20 s[j] = s[i]; 21 s[i] = temp; 22 j++; 23 i--; 24 } 25 } 26 27 int main() 28 { 29 __uint128_t n = 0; 30 31 n = ~n; 32 int count = 0; 33 while(n > 0) { 34 count++; 35 n >>= 1; 36 } 37 38 cout << "count=" << count << endl; 39 cout << "__uint128_t size=" << sizeof(__uint128_t) << endl; 40 cout << endl; 41 42 cout << "__int128_t size=" << sizeof(__int128_t) << endl; 43 44 __int128_t x = 1100000000000000L; 45 __int128_t y = 2200000000000000L; 46 char s[40]; 47 48 x *= y; 49 50 myitoa(x, s); 51 52 cout << "x=" << s << endl; 53 54 return 0; 55 }
打印结果如下:
count=128 __uint128_t size=16 __int128_t size=16 x=2420000000000000000000000000000
以下是__int128的OJ简单应用,写题必备神器。
a+b大数读入模板:
1 #include <bits/stdc++.h> 2 using namespace std; 3 inline __int128 read() 4 { 5 __int128 x=0,f=1; 6 char ch=getchar(); 7 while(ch<'0'||ch>'9') 8 { 9 if(ch=='-') 10 f=-1; 11 ch=getchar(); 12 } 13 while(ch>='0'&&ch<='9') 14 { 15 x=x*10+ch-'0'; 16 ch=getchar(); 17 } 18 return x*f; 19 } 20 21 inline void write(__int128 x) 22 { 23 if(x<0) 24 { 25 putchar('-'); 26 x=-x; 27 } 28 if(x>9) 29 write(x/10); 30 putchar(x%10+'0'); 31 } 32 33 int main() 34 { 35 __int128 a = read(); 36 __int128 b = read(); 37 write(a + b); 38 return 0; 39 }
测试了一下,OJ提交没问题~~~
另外关于C/C++大数类,这里还给您提供了一个好的实现机制,源码我已经上传,下载链接在这里:https://files.cnblogs.com/files/ECJTUACM-873284962/bigint-10-2-src.7z
运行结果可以看到如下所示:
C++ BigInt class that enables the user to work with arbitrary precision integers.
Latest Version: 10.2
Project Samples
您可以考虑给博主来个小小的打赏以资鼓励,您的肯定将是我最大的动力。thx.
微信打赏
支付宝打赏
作 者: Angel_Kitty
出 处:http://www.cnblogs.com/ECJTUACM-873284962/
关于作者:潜心机器学习以及信息安全的综合研究。如有问题或建议,请多多赐教!
版权声明:本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。
特此声明:所有评论和私信都会在第一时间回复。也欢迎园子的大大们指正错误,共同进步。或者直接私信我
声援博主:如果您觉得文章对您有帮助,可以点击右下角【推荐】推荐一下该博文。您的鼓励是作者坚持原创和持续写作的最大动力!
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
python 特征选择①
移除低方差的特征(Removing features with low variance) VarianceThreshold 是特征选择中的一项基本方法。它会移除所有方差不满足阈值的特征。默认设置下,它将移除所有方差为0的特征,即那些在所有样本中数值完全相同的特征。 假设我们有一个带有布尔特征的数据集,我们要移除那些超过80%的数据都为1或0的特征。布尔特征是伯努利随机变量,该类变量的方差为: 我们可以使用阈值 .8 * (1 - .8): >>> from sklearn.feature_selection import VarianceThreshold >>> X = [[0, 0, 1], [0, 1, 0], [1, 0, 0], [0, 1, 1], [0, 1, 0], [0, 1, 1]] >>> sel = VarianceThreshold(threshold=(.8 * (1 - .8))) >>> sel.fit_transform(X) array([[0, 1], [1, 0], [0...
- 下一篇
Java中死锁的定位与修复
死锁应该可以说是并发编程中比较常见的一种情况,可以说如果程序产生了死锁那将会对程序带来致命的影响;所以排查定位、修复死锁至关重要; 我们都知道死锁是由于多个对象或多个线程之间相互需要对方锁持有的锁而又没有释放对方所持有的锁,导致双方都永久处于阻塞状态; 如上图所示,线程1持有对象1的锁、线程2持有对象2的锁,持此线程1又想去获取对象2对象锁、线程2想获取对象1对象锁,此时由于双方都没有获取到想要的锁,任务没完成所以也没释放锁,导致一直僵持呢,于是阻塞、产生死锁; 死锁检测 需要检测死锁肯定要先有死锁出现,下面的demo模拟了一个死锁的产生; public class DeadlockDemo extends Thread { private BaseObj first; private BaseObj second; public DeadlockDemo(String name, BaseObj first, BaseObj second) { super(name); this.first = first; this.second = second; } public void r...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Mario游戏-低调大师作品
- CentOS6,CentOS7官方镜像安装Oracle11G
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- Windows10,CentOS7,CentOS8安装Nodejs环境
- Docker安装Oracle12C,快速搭建Oracle学习环境
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- CentOS8编译安装MySQL8.0.19
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS8安装Docker,最新的服务器搭配容器使用
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7