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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏积累沉淀

Linux之grep和egrep命令总结

grep / egrep 语法: grep  [-cinvABC]  'word'  filename -c :打印符合要求的行数 -i :忽略大小写 ...

18910
来自专栏IT可乐

Java IO详解(三)------字节输入输出流

 File 类的介绍:https://cloud.tencent.com/developer/article/1012532 Java IO 流的分类介绍:ht...

23810
来自专栏爱撒谎的男孩

Struts2之获取请求参数

3476
来自专栏微信公众号:Java团长

Java基础知识详细总结

ClassLoader使用的是双亲委托模型来搜索类的,每个ClassLoader实例都有一个父类加载器的引用(不是继承的关系,是一个包含的关系),虚拟机内置的类...

1313
来自专栏康怀帅的专栏

Bash 条件判断与流程控制相关语句详解

介绍 if case 等语句。 条件判断语句 字符串判断 str1 = str2    当两个字符串有相同内容、长度时为真 str1 != str2   当字符...

2614
来自专栏java一日一条

50个常见的 Java 错误及避免方法(第二部分)

System.out.println("Whatdo you want to do?");

1153
来自专栏java初学

spring框架(1)— 依赖注入

46412
来自专栏张首富-小白的成长历程

redis管理

Redis发布消息通常有两种模式: • 队列模式(queuing) • 发布-订阅模式(publish-subscribe) 任务队列:顾名思义,就是“...

2083
来自专栏FreeBuf

Safari信息泄露漏洞分析

Javascript中的数组和数组对象一直都是编程人员优化的主要目标,一般来说,数组只会包含一些基本类型数据,比如说32位整数或字符等等。因此,每个引擎都会对这...

902
来自专栏漫漫全栈路

ASP.NET MVC 行为详解

前面分别介绍了MVC中的三个重要部分,而行为,则是其中C-Controller中的重要内容,下面详解一二。 一般继承自Controller类,类Controll...

2804

扫码关注云+社区

领取腾讯云代金券