共计 3731 个字符,预计需要花费 10 分钟才能阅读完成。
作者:柒烨带你飞
本文为原创文章,版权归自己所有。
文章首发于 CSDN:https://blog.csdn.net/m0_61643743/article/details/130260640
十进制转二进制
整数十进制转二进制转换方法 + 如何用代码实现为次要内容
一,十进制转二进制办法
办法 1:除二取余法
十进制数除 2 得商取余法 :对十进制进行除法运算, 十进制除以 2 能够失去一个 商和余数 ;再用 失去的商除以 2 又 失去一个 商和余数 , 以此内推,中转最初一次除以 2,商为 0 或 1 进行
十进制转换例子:(13)(20)把这 2 个十进制数转换为二进制
13/2 = 6…..1,6/2 = 3…..0,3/2 = 1…..1 ,1/2 = 0…..1 ;把余数 逆序 排列,13 的二进制数就是:1101。
20/2 = 10…..0 10/2 = 5…..0 5/2 = 2…..1 2/2 = 1…..0 1/2 = 0…..1 20 的二进制数就是:10100
十进制转二进制时只需算出 整数商 即可,如理论 5/2 = 2.5,算出 整数商 2 取余就好,如:5/2 = 2….1
办法 2:按权相加法
法则如下:
二进制 | 10000000 | 1000000 | 100000 | 10000 | 1000 | 100 | 10 | 1 |
---|---|---|---|---|---|---|---|---|
十进制 | 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 |
位权(幂模式) | 2^7 | 2^6 | 2^5 | 2^4 | 2^3 | 2^2 | 2^1 | 2^0 |
依据下面的法则,假如上面 8 位二进制都是 0
128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 |
---|---|---|---|---|---|---|---|
1 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
求 129 的二进制数:只需把下面表格中 128 和 1 上面的 0 改为 1(128+1 =129)129 的二进制数:10000001
128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 |
---|---|---|---|---|---|---|---|
1 | 0 | 0 | 0 | 0 | 1 | 1 | 1 |
** 求 135 的二进制数:(128+2+4+1=135)135 的二进制数:10000111 128 比 135 小所以 128 下改 1,135-128 = 7。
64,32,16,8 比 7 大所以都设为 0,4 比 7 小设 1,7-4=3;2 比 3 小设 1,最初残余的 1,1 等于 1 设 1 **
16 | 8 | 4 | 2 | 1 |
---|---|---|---|---|
1 | 0 | 1 | 0 | 0 |
求 20 的二进制数:(16+4=20)20 的二进制数:10100。16 比 20 小设 1,20-16=4,8 比 4 大设 0,4 等于 4 设 1。
8 | 4 | 2 | 1 |
---|---|---|---|
1 | 0 | 1 | 0 |
求 10 的二进制数:(8+2=10)10 的二进制数:1010。8 比 10 小设 1,10-8=2,4 比 2 大设 0,2 等于 2 设 1
借助这个办法十进制转二进制更容易,纯熟了之后笔算,心算一下就能算出二进制数,不必像除 2 取余法一样繁冗
二,代码实现
实例:
步骤实现:
获取用户输出的十进制数。
判断用户输出的数据是否不符合要求,合乎则进入下一阶段,不合乎则从新输出或退出。
十进制转二进制运算实现区
输入失去的二进制数
1,C 代码实现
#include<stdio.h>
int main(){short BinaryNumbe[32]={0};// 定义一个数组存储二进制数
int i,n;// i 为数组下标,n 用来存储十进制数
/* 步骤 1:获取用户输出的十进制数。判断用户输出的数据是否符合要求,合乎则进入下一阶段,不合乎则从新输出 */
do
{printf("请输出要转换的十进制数(1-2147483647):");// 提醒输出十进制
scanf("%d",&n);//scanf 获取输出的数据
if (n <= 0 || n > 2147483647)/* 用 if 判断数据是否输出有误,有误则从新输出 */
{printf("输出有误,十进制转二进制范畴为(1-2147483647)\n");
continue;
/* 提醒输出有误,用 continue 完结本次循环,再进行一次循环 */
}
} while (0);
/* 步骤 2:十进制转二进制计算实现区。用 for 循环,i 为数组下标,计算十进制除 2 去余赋值给寄存二进制数据的数组 */
for (i = 0; i < 32 ; i++)//int 最大值为(2147483647)32 位二进制数最大也是 2147483647。所以循环次数设置为 32(0-31){BinaryNumbe[i] = n % 2;// 取余赋值给数组
n = n / 2; // 除以 2,失去下一个商,赋值给 n
if (n == 0)
{break;// 当商等于 0 时,不再进行多余次数的循环,break 跳出循环;}
}
/* 步骤 3:输入二进制数据。下面 i ++ 曾经记录了循环计算的次数。i 循环的次数 == i 位二进制数 == 数组 [i] 最初赋值的余数。间接在上面 for 循环中加个 i >= 0 ; i--,就能逆序输入了。*/
printf("二进制数是:");
for (n = 1 ; i >= 0 ; i--)
{printf("%d",BinaryNumbe[i]);// 逆序打印二进制数
if (n%4 == 0)
{// 为了好看,用 if 判断每输入 4 个二进制数,打印一个空格。// 该段用 n 来记录了输入次数,该段代码可不加
printf(" ");
}
n++;
}
printf("\n");// 换行
system("pause");
return 0;
}
把上述代码简化改成一个函数,思路不变
void Binary(int n){short Binary[32] ={0};// 定义一个数组寄存二进制 0 1
int i = 0;// 数组下标
for (; i < 32; i++)
{Binary[i] = n%2;
n = n/2;
if (n == 0)
{break;}
}
printf("二进制数是:");
for (; i >= 0; i--)
{printf("%d",Binary[i]);
}
printf("\n");
}
利用该函数代码如下
#include<stdio.h>
void Binary(int n);
//========================= 主函数 main==========================//
int main()
{
int n;
printf("请输出十进制数:");
scanf("%d",&n);
Binary(n);
system("pause");
return 0;
}
//========================== 函数功能区 =========================//
void Binary(int n){short Binary[32] ={0};// 定义一个数组寄存二进制 0 1
int i;// 数组下标
for (i = 0; i < 32; i++)
{Binary[i] = n%2;
n = n/2;
if (n == 0)
{break;}
}
printf("二进制数是:");
for (; i >= 0; i--)
{printf("%d",Binary[i]);
}
printf("\n");
}
再次简化用另一种思路批改(递归思路),这种代码量更小更快捷,十进制转二进制函数实现
void Binary(int n){//int n 为十进制数
short t = 0;// 定义 t 存储二进制
if(n != 0){
t = n % 2;
n = n / 2;
/* 重点
调用函数自身,一层层调用函数自身往下运算。直到 n == 0 时不再调用函数自身,从里到外一层层的打印获得的余数 */
Binary(n);
printf("%d",t);
}
}
残缺代码如下
#include<stdio.h>
void Binary(int n);
//========================= 主函数 main==========================//
int main(){
int n;
printf("请输出十进制数:");
scanf("%d",&n);
Binary(n);
system("pause");
return 0;
}
//========================== 函数功能区 =========================//
void Binary(int n){
short t = 0;
if(n != 0){
t = n % 2;
n = n / 2;
Binary(n);
printf("%d",t);
}
}
2,C++ 代码实现
#include <iostream>
using namespace std;
int main()
{short BinaryNumbe[32]={0};// 定义一个数组存储二进制数
int i,n;// i 为数组下标,n 用来存储十进制数
do
{
cout << "请输出十进制数:" ;
cin >> n;//cin 获取用户输出的十进制数
if (n <= 0 || n>2147483647)//if 判断输出的数据是否有误
{cout << "输出有误,本程序十进制转二进制范畴为(1-2147483647):"<< endl;
continue;//continue 完结本次循环,再进行一次循环
}
} while (0);
for (i = 0; i<32; i++)
{BinaryNumbe[i] = n % 2;// 取余赋值给数组
n = n / 2;// 除以 2,失去下一个商,赋值给 n
if (n == 0)//// 当商等于 0 时,不再进行多余次数的循环,break 跳出循环;{break;}
}
/* 下面 i ++ 曾经记录了循环计算的次数。i 循环的次数 == i 位二进制数 == 数组 [i] 最初赋值的余数。间接在上面 for 循环中加个 i >= 0 ; i--,就能逆序输入了。*/
cout << "二进制数是:";
for (; i >= 0; i--)
{cout << BinaryNumbe[i] ;// 逆序打印二进制数
}
cout << endl;// 换行
system("pause");
return 0;
}