C语言二进制转十进制
本文全面讨论了将二进制数转换为十进制数的多个 C 实现。 但是,在开始实施之前,我们必须寻找不可避免的转换基础。
C语言二进制转十进制
二进制数只能包含两个值:0 和 1。但是,十进制表示法有十个符号:0 到 9 (0,1,2,3,4,5,6,7,8,9)。
二进制 (0,1) 表示法是计算机硬件固有的,而十进制值是人类可以轻松理解的整数值。
转换方法
二进制数 0101 相当于十进制的 5。 二进制到十进制的转换方法非常简单,如下式所示:
这里 B 是完整的二进制数,B_{i}
表示给定二进制数中的第 i^th^
位。 n 表示给定二进制数中的总位数。
让我们将上面的公式应用于二进制数 0101。从左到右求和,我们得到:
硬件方面使用二进制语言,因为电子电路中有信号和逻辑门; 系统很容易理解。 每一个二进制数 0 或 1 都称为 1 位。
将二进制数转换为十进制数的算法
让我们看一下解决此转换问题的分步过程。
- 启动程序。
- 以二进制数作为输入。
-
如果数字大于 0,则将数字除以 10 并取余数与
2*i
的乘积,其中 i 从零开始。 - 按照步骤 3 中的讨论继续除商,并在每次迭代中将 i 递增 1。
- 将所有产品相加并返回结果。
有多种实现选择可以解决这个问题。 让我们开始一一讨论这些方法。
方法 1:使用循环和整数变量进行转换
for 和 while 循环可以将二进制转换为十进制。
使用 while 循环
在这种方法中,除法运算会将二进制转换为十进制。
#include <stdio.h>
#include <math.h>
int main()
{
int binary_number;
printf("Enter Binary number: ");
scanf("%d",&binary_number);
int decimal=0, temp=0, reminder;
while(binary_number !=0)
{
reminder = binary_number % 2;
binary_number =binary_number /10;
decimal = decimal + reminder * (int)pow(2,temp);
temp++;
}
printf("Decimal number is : %d", decimal);
return 0;
}
main()
中的第一行声明了一个名为 binary_number 的变量来获取二进制输入。 在输入二进制数后,我们进一步声明三个变量:
- decimal:存储结果的十进制值
- temp:用作迭代计数器
- remainder:存储每次迭代的余数
在每次 while 循环迭代中,我们首先从 binary_number 中确定最右边的位并将其保存在 remainder 变量中。
然后,我们将 binary_number 除以 10,并将结果覆盖为自身。 这会导致 binary_number 丢失其最右边的位。
此外,正如文章开头所讨论的,我们应用公式来汇总十进制变量中的加权产品。 最后,我们打印生成的十进制等效值。
让我们看看输出。
for 循环
两个循环(for 和 while)的基本结构相似。 使用 for 循环的优点是在一行中直接声明和初始化变量。
这是另一个使用 for 循环将二进制数转换为十进制值的程序。
#include<stdio.h>
int main()
{
int binary, decimal=0, base=1, remainder, temp;
printf("Enter binary number: ");
scanf("%d", &binary);
for (temp=binary; temp>0; temp = temp/10)
{
remainder = temp % 2;
decimal = decimal + remainder *base ;
base= base *2;
}
printf("Decimal number is:%d", decimal);
return 0;
}
在 for 循环实现中,我们使用了与 while 循环略有不同的方法。
我们没有使用代价高昂的 pow()
函数,而是创建了一个变量 base,它会在每次迭代中将自身乘以 2 的值。 这将确保在第 i^th^
次迭代开始时,基本变量的值等于 2^i^
,其中 i 从零开始。
输出:
方法 2:使用程序方法
此方法将使用用户定义的过程或函数来解决转换问题。 如果你想让你的代码更可重用和模块化,这种方法是最可取的。
#include <stdio.h>
#include <math.h>
int binarytodecimal(int binary_number)
{
int decimal =0, temp=0, remainder;
while (binary_number !=0)
{
remainder = binary_number %2;
decimal = decimal + (remainder * pow(2,temp));
binary_number = binary_number/10;
temp++;
}
return decimal;
}
int main()
{
int binary_number, decimal;
printf("Enter binary number: ");
scanf("%d", &binary_number);
decimal = binarytodecimal(binary_number);
printf("Decimal Number is: %d", decimal);
return 0;
}
一切都与我们之前的方法相同,只是我们将整个转换代码封装到一个过程 binarytodecimal() 中。
方法3:使用char数组存储二进制数
在前面讨论的所有方法中,主要问题是整数的大小。 我们以整数编码存储二进制数。
因此,对于 16 位编译器,我们可以提供的最大数字是 111111。
具有更大整数大小的 32 位和 64 位编译器肯定会增加输入范围并解决问题。 但是,这个问题会在旧版本中吓到我们。
幸运的是,我们有一个 hack 来解决这个问题,即使用动态 char 数组来存储二进制数而不是整数变量。 让我们看看下面的代码来理解这个策略。
#include <stdio.h>
#include <math.h>
#include<stdlib.h>
#include <conio.h>
int main()
{
long decimal=0; int size;
printf("\nEnter maximum number of digits in your Binary number: ");
scanf("%d",&size);
char* BinaryArr = (char*)malloc(size+1);
printf("Please Enter your Binary Number: ");
scanf("%s",BinaryArr);
char ch;
for(int i=size-1, j=0; i>=0;i--,j++){
ch=BinaryArr[i];
decimal += atoi(&ch)* (int)pow(2,j);
}
printf("The equivalent decimal number is: %d", decimal);
return 0;
}
我们首先要求用户确认他们想要转换为十进制等值的二进制数的大小。
鉴于我们知道二进制数的大小,我们使用 malloc()
函数动态分配该大小的数组。 malloc()
在 stdlib.h 中定义并以字节为单位分配动态内存。
为了使它成为一个字符数组,我们明确地将 malloc()
的返回指针类型转换为 char*
类型。
接下来,我们将二进制数作为输入到字符指针BinaryArr指向的字符数组中。
之后,我们从最后一个索引(即二进制数的最低有效位)开始迭代这个字符数组,并在每次迭代后将二进制字符一个一个地移近索引 0。
我们在每次迭代中将第 i^th^ 个索引存储在辅助 ch 变量中。 然后,我们应用 atoi() 函数来获取等效的整数值。
然后,我们将所有内容都放入本文开头讨论的公式中。
最后,一旦循环终止,我们就打印出最终的十进制值。 让我们看看它在输出控制台上的感觉。
相关文章
在 C 语言中使用 typedef enum
发布时间:2023/05/07 浏览次数:181 分类:C语言
-
本文介绍了如何在 C 语言中使用 typedef enum。使用 enum 在 C 语言中定义命名整数常量 enum 关键字定义了一种叫做枚举的特殊类型。
C 语言中的 extern 关键字
发布时间:2023/05/07 浏览次数:114 分类:C语言
-
本文介绍了如何在 C 语言中使用 extern 关键字。C 语言中使用 extern 关键字来声明一个在其他文件中定义的变量
C 语言中的 #ifndef
发布时间:2023/05/07 浏览次数:186 分类:C语言
-
本文介绍了如何在 C 语言中使用 ifndef。在 C 语言中使用 ifndef 保护头文件不被多次包含 C 语言中的头文件用于定义同名源文件中实现的函数的接口。