作者:柒燁帶你飛
本文為原創文章,版權歸本人所有。
文章首發於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;
}