作者:柒烨带你飞
本文为原创文章,版权归本人所有。
文章首发于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
求20的二进制数:(16+4=20) 20的二进制数:10100。16比20小设1,20-16=4,8比4大设0,4等于4设1。
求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:
获取用户输入的十进制数。
判断用户输入的数据是否符合要求,符合则进入下一阶段,不符合则重新输入*/
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(" ");
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用来存储十进制数
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;
LeetCode1290 二进制链表转整数C++解法(vector实现)
给你一个单链表的引用结点 head。链表中每个结点的值不是 0 就是 1。已知此链表是一个整数数字的二进制表示形式。
请你返回该链表所表示数字的 十进制值 。
Linux C++ 应用二进制兼容实践
本文将介绍一些在开发多 Linux 平台 C++ 应用时可能遇到的兼容性问题和相关的解法。虽然是以 C++ 为讲述对象,但兼容性这个问题,在没有 VM 帮你做这些脏活累活的情况下,是所有 C-like 语言(比如 Go、Rust 等)都可能遇到的。