目录
1.进制
1.1 进制的概念
在日常生活中,我们会经常听到进制这一说,可所谓的进制到底是什么呢?
进制: 也称为计数制,是一种计数的方法,是用一组固定的符号和统一的规则来表示数值的方法。一般常见的进制有二进制,八进制,十进制与十六进制。
进制中还有一个重要的知识就是位权。
位权:指数制中每一固定位置对应的单位值。例如,在十进制数1234中,1的位权是1000,2的位权是100,3的位权是10,1的位权就是1。
在了解了进制以后,你是否会思考进制有什么用呢?在计算机中,二进制就是特别重要的,因为所有的语言到了计算机这里,就都会转换成二进制来保存。
1.2 进制的表达方式
一般来说,进制的表达方式有两种,一种是形如(10111101)2,(6165)8这样用数字下标表示的,还有一种是用字母的后缀表示的,例如(2AF)H,(11011011001011)B 这样的。
1.3 原码,反码,补码
在计算机的二进制语言中,有着原码,反码,补码。
原码:在一个二进制数前加了一位符号位便是原码。
反码:正数的反码就是原码,而负数的反码就是除符号位之外,全部取反。
补码:正数的补码就是原码,而负数的补码是负数的反码加1。
知道了原码,反码,补码以后又是来干什么的呢?这就要跟进制的转换扯上关系了。
2.进制的转换
2.1 正数的进制转换
2.1.1 其他进制转十进制
如果遇到一个其他进制的数,我们想看得懂,就需要转换成十进制数,可是又该怎么转换呢?答案是用位权展开法。位权展开法,顾名思义,就是一个数每一位所对的数乘上自己对应的位权。
例如,(1010101)2=1 * 26 + 0 * 25 + 1 * 24 + 0 * 23 + 1 * 22 + 0 * 21 + 1 * 20=85
代码如下:
#include <bits/stdc++.h>
using namespace std;
string s;
int ans,jz;
int main(){
cin>>s>>jz;
for(int i=0;i<s.size();i++){
ans+=(s[s.size()-1-i]-'0')*pow(jz,i);
}
cout<<ans<<endl;
return 0;
}
2.1.2 十进制转其他进制
那如果我们遇到一个十进制数,但我们需要转换成其他进制再来储存有该怎么办呢?那就不用位权展开法了,而是用短除法,用那个十进制数除以进制,然后将余数储存,直到除到向下取整商为0时,再将余数倒序输出就行了。
例如:
代码如下(仅为十进制转二进制):
#include<bits/stdc++.h>
using namespace std;
int d,b,i=1,ans;
int main(){
cin>>d;
while(d!=0){
b = d % 2;
ans += i*b;
d /= 2;
i *= 10;
}
cout<<ans<<endl;
}
2.2 负数的进制转换
既然知道了正数的进制转换方法,那就再来看一下负数的转换方法。其实非常简单,就是先把这个负数先把它当成正数,然后算出这个正数的其他进制数,这就是这个负数的原码,然后求出这个原码的补码其实就是这个负数的其他进制数了。而其他进制转十进制就是相反的过程,这里就不过多赘述。
3.总结
在计算机中,二进制是非常重要的,毕竟需要将所有其他进制的数都要转换成二进制。所以我们也需要学会转换,在某些时候,也是会有用的。