博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C/C++中int128的那点事
阅读量:6971 次
发布时间:2019-06-27

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

最近群友对int128这个东西讨论的热火朝天的。讲道理的话,编译器的gcc是不支持__int128这种数据类型的,比如在codeblocks 16.01/Dev C++是无法编译的,但是提交到大部分OJ上是可以编译且能用的。C/C++标准。IO是不认识__int128这种数据类型的,因此要自己实现IO,其他的运算,与int没有什么不同。

但是官方上写了GCC提供了两种128位整数类型,分别是__int128_t和__uint128_t,分别用于声明有符号整数变量和无符号整数变量。

有关GCC的文档参见:。

这里给出了样例程序,是有关类型__int128_t和__uint128_t的。从计算可以看出,这两个类型都是16字节的,类型__uint128_t是128位的。程序中使用了按位取反运算,移位运算和乘法运算。

由于这种大整数无法使用函数printf()输出其值,所以自己做了一个整数转字符串函数myitoa(),用于实现128位整数的输出。

有兴趣的同学想了解底层实现原理可以参看我的Github上:

代码实现如下:

1 #include 
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 
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++大数类,这里还给您提供了一个好的实现机制,源码我已经上传,下载链接在这里:

运行结果可以看到如下所示:

C++ BigInt class that enables the user to work with arbitrary precision integers.

Latest Version: 10.2

Project Samples

 

您可以考虑给博主来个小小的打赏以资鼓励,您的肯定将是我最大的动力。thx.

微信打赏

微信账号 nzf6698

支付宝打赏

支付宝账号 18979406698

作  者:
出  处:
关于作者:潜心机器学习以及信息安全的综合研究。如有问题或建议,请多多赐教!
版权声明:本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。
特此声明:所有评论和私信都会在第一时间回复。也欢迎园子的大大们指正错误,共同进步。或者我
声援博主:如果您觉得文章对您有帮助,可以点击右下角【】推荐一下该博文。您的鼓励是作者坚持原创和持续写作的最大动力!

你可能感兴趣的文章
View绘制机制
查看>>
跟KingDZ学HTML5之四 继续探究Canvas之路径
查看>>
054_VisualForce Ajax 01
查看>>
Android性能优化问题总结
查看>>
html5中 背景自适应
查看>>
比赛--整理花园问题--解题报告
查看>>
【Linux】基础配置-修改命令提示符的风格
查看>>
Wiform获取控件相对位置
查看>>
ASCII码、字符与字符串的显示
查看>>
Java 二进制,八进制,十进制,十六进制转换
查看>>
PHP7语法知识(四):目录文件操作、Cookie与Session、MySQL数据库的使用、Redis数据库、PHP处理XML与JSON...
查看>>
bzoj1212
查看>>
Datawhale编程——队列
查看>>
Bzoj3597: [Scoi2014]方伯伯运椰子
查看>>
LOJ #2985. 「WC2019」I 君的商店
查看>>
CSS 基本知识
查看>>
多选框
查看>>
Switf与OC混合开发流程
查看>>
MySQL数据库----多表查询
查看>>
查看日志文件组状态信息+切换日志文件组+手动切换日志文件组+清空日志文件组+...
查看>>