高级光能
- 进制转换难道不是在模拟之前吗?(灵魂拷问)
进入正题:
何为进制转换捏?
引言
日常生活中我们一般用十进制来计数,逢十进一。
比如从1数到9都是一位数,然而到10就变成了两位数,发生了进位。
从19往上数是20,也发生了进位:19的个位9加1之后变成10,个位装不下了,所以进位。
然而除了十进制,人们还发明了别的计数制(进制),比如计算机内部存储数据用的是二进制。除此之外还有八进制,十六进制等等……
这里我就来讲讲十进制数与二进制数的互相转化。 ——引用于讲义
首先:何为进制?
进位制计数法是一种记数方式,可以用有限的数字符号代表所有的数值。可使用数字符号的数目称为基数或底数,底数为n,即可称n进制。(逢n进1)
如:十进制的底数是10 ,逢10进1,我们使用0~9这10个数字表示十进制的所有数;
二进制的底数是2,逢2进1,我们使用0和1这两个数字就可以表示二进制的所有数。
对于底数超过十的进制的数字,除了用0~9的数字,还需要用到大写字母来表示该进制的数字。比如需要用0~9以及大写字母A来表示十一进制的数字,其中A的数值等效于10。 ——引用于讲义
那么:不同进制如何表示捏?
在数字的右下角写上底数(加括号)。
如:十进制的123: 123(10)
二进制的1101: 1101(2)
——引用于讲义
累了,以下内容全部引用于讲义(doge
二进制数与十进制数的互相转化 二进制与十进制的对应关系 image.png
1)二进制转十进制
原理: 将二进制数的每一位乘以相应的系数再相加,即得到对应的十进制数字。 如:将1101(2)转换成十进制数: 将1101从右到左每个数乘以20, 21, 22, 23 120+021+122+123 = 1+0+4+8 =13
代码实现: 输入一个二进制数n,将它转换成十进制形式输出
思路:每次取二进制数的最后一位(n%10),乘以相应的系数,加到最终的结果中,加完之后把这最后一位删掉(n/=10),系数每次也要做相应的改变。
#include<iostream>
using namespace std;
int main()
{
long long n,w,s=0,t=1; //s:用于存储十进制结果, t:系数的初值为1
cin>>n;
while(n)
{
w=x%10; //取n的最后一位
s=s+w*t; //将二进制最后一位数乘以相应的系数加到和s中
t=t*2; //系数扩大2倍
n=n/10; //去掉n的最后一位
}
cout<<s;
return 0;
}
2)十进制转二进制
原理: 十进制整数转换为二进制整数采用 “除2取余,逆序排列” 法。
具体做法是:用2整除十进制整数,可以得到一个商和余数;再用2去除商,又会得到一个商和余数,如此进行,直到商为0时终止,然后将这些余数按照得到的顺序从后往前依次排列起来。
代码实现
#include<iostream>
using namespace std;
int a[100];
int main()
{
long long n;
cin>>n;
int i=0;
while(n){
a[++i]=n%2; //除2取余,将余数存进数组
n/=2;
}
for(int j=i;j>=1;j--) //逆序输出
cout<<a[j];
return 0;
}
以下手打:
k转十&十转k同理,扩大或除求余的数更改即可
新手守护
引言
日常生活中我们一般用十进制来计数,逢十进一。
比如从1数到9都是一位数,然而到10就变成了两位数,发生了进位。
从19往上数是20,也发生了进位:19的个位9加1之后变成10,个位装不下了,所以进位。
然而除了十进制,人们还发明了别的计数制(进制),比如计算机内部存储数据用的是二进制。除此之外还有八进制,十六进制等等……
这节课我们就来学习十进制数与二进制数的互相转化。
一、课堂知识
1. 什么是进制
进位制计数法是一种记数方式,可以用有限的数字符号代表所有的数值。可使用数字符号的数目称为基数或底数,底数为n,即可称n进制。(逢n进1)
如:十进制的底数是10 ,逢10进1,我们使用0~9这10个数字表示十进制的所有数;
二进制的底数是2,逢2进1,我们使用0和1这两个数字就可以表示二进制的所有数。
对于底数超过十的进制的数字,除了用0~9的数字,还需要用到大写字母来表示该进制的数字。比如需要用0~9以及大写字母A来表示十一进制的数字,其中A的数值等效于10。
2. 不同进制数字的表示方法
在数字的右下角写上底数(加括号)。
如:十进制的123: 123(10)
二进制的1101: 1101(2)
3. 二进制数与十进制数的互相转化
二进制与十进制的对应关系
1)二进制转十进制
原理: 将二进制数的每一位乘以相应的系数再相加,即得到对应的十进制数字。
如:将1101(2)转换成十进制数: 将1101从右到左每个数乘以20, 21, 22, 23
1*20+0*21+1*22+1*23 = 1+0+4+8 =13
输入一个二进制数n,将它转换成十进制形式输出
思路:每次取二进制数的最后一位(n%10),乘以相应的系数,加到最终的结果中,加完之后把这最后一位删掉(n/=10),系数每次也要做相应的改变。
2)十进制转二进制
原理: 十进制整数转换为二进制整数采用 “除2取余,逆序排列” 法。
具体做法是:用2整除十进制整数,可以得到一个商和余数;再用2去除商,又会得到一个商和余数,如此进行,直到商为0时终止,然后将这些余数按照得到的顺序从后往前依次排列起来
新手守护
n进制转十进制
分析: 可以数字定义成字符串来输入。
数字各位上的数对应字符串下标0~字符串长度-1的元素,则从右往左分别将每个数字(注意字符数字要减掉’0’才得到对应的数字)乘以相应的系数,再相加得到结果。
中级守护
比如我要将35转化为16进制,在cout中,可以这么转换:
输出<<hex<<35;
8进制:
输出<<oct<<35;
2进制(保留N位):
输出 << bitset<n>(35);
转10进制:
输出<<dec<<35;
注意,hex、oct、dec不是变量!
资深光能
十进制转二进制:
首先定义一个 整型变量/长整型变量 n,还有一个字符串ans
然后输入n
接着是一个循环(for也可以,但是建议用while,我就用while),条件是n就可以
循环内部是ans变成字符型的n模2再加上'0',还要拼接ans本身,别忘了n还要除以2
最后输出ans即可
二进制转化十进制:
首先定义一个 整型变量/长整型变量sum(初始值为0)和t(初始值为1)还有k,还有一个字 符串s
然后输入s
k赋值为s的长度
这里的循环就是建议用for,从k减1到0(包括0),每次循环的变量自减一次
里面是sum加等于s的当前位减'0'的和乘上t,t每次乘等于2
最后输出sum就可以了