数论——进制
进制#
我们平时用的数字都是逢十进一的,称为十进制,逢b进一的计数规则就叫b进制。记作。如为二进制数字100110
。b称为基数。
如何转换#
我们主要注重任何进制和十进制之间的转换。
b进制展开式#
设有一b进制数,下面这个式子可以将它转换成十进制数n。
转换到b进制#
把一十进制数n转换成b进制,首先我们要构造这样的式子:
这就是上一篇笔记的求余运算嘛,我们得到了两个新的数,商q和余数r。
然后,我们再递归构造上面的式子,把q当作n:
直到最后除不下去了,我们把之前的余数反向组合起来,就是结果。
举个例子
n进制转m进制#
先思考一个简单的办法,现在我们已经掌握了任意进制到10进制的转换,也掌握了十进制到任意进制的转换,那么对于n,我们可以先把它转换成10进制,再把这个十进制数转换成m进制,不就好了吗。
C++代码
#include "iostream"
#include "string"
#include "cmath"
using namespace std;
int n2t(int src,int base){
int result = 0;
int level = 0;
while(src!=0){
int x = src%10;
src = src / 10;
result += x * pow(base,level++);
}
return result;
}
int t2n(int src,int target_base){
int result = 0;
int level = 0;
while(src!=0){
int mod = src % target_base;
src = src / target_base;
result = mod * pow(10,level++) + result;
}
return result;
}
int n2m(int src,int base,int target_base){
if(target_base==10)
return n2t(src,base);
else if(base == 10)
return t2n(src,target_base);
else{
return t2n(n2t(src,base),target_base);
}
}
int main(){
cout << n2t(120,8) << endl;
cout << t2n(80,8) << endl;
cout << n2m(16,8,2) << endl;
return 0;
}
这段代码只能完成2~10进制的任意转换,因为使用的是int类型,无法表述10进制以上的数了,可以使用字符串解决这个问题。
有没有更简单的办法呢?其实有。
我们常用的进制就是二进制,八进制,十进制,十六进制。对于八进制,因为,所以1位八进制数可以完整的用3位二进制来表示,这样就可以建立一对一关系。而十六进制也是一样的,1位十六进制可以完整的用4位二进制来表示。
二进制 | 八进制 | 十六进制 |
---|---|---|
000 | 0 | 0 |
001 | 1 | 1 |
010 | 2 | 2 |
011 | 3 | 3 |
100 | 4 | 4 |
101 | 5 | 5 |
110 | 6 | 6 |
111 | 7 | 7 |
1000 | 10 | 8 |
1001 | 11 | 9 |
1010 | 12 | A |
1011 | 13 | B |
1100 | 14 | C |
1101 | 15 | D |
1110 | 16 | E |
1111 | 17 | F |
我们几个八进制来举例,比如,我们先查,发现,然后查,所以就是把每个八进制位对应的二进制数简单的做字符串相加即可得到,去除前面的00,查表发现结果是正确的。十六进制也是一样,不演示了。
所以有了这个理论基础,对于二的幂次作为基数的进制,我们可以直接建立一个表,让计算机去查表,这样就可以更快的完成运算。
伪代码
h2b_table = {0->0000,1->0001,...,F->1111}
function h2b(hexString): string
result = ""
for each char c in hexString
result += h2b_table[c];
return removeFrontSpace(result)
作者:Yudoge
出处:https://www.cnblogs.com/lilpig/p/13768217.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
欢迎按协议规定转载,方便的话,发个站内信给我嗷~
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· winform 绘制太阳,地球,月球 运作规律
· 上周热点回顾(3.3-3.9)