1. c語言中的進制怎麼轉換啊
關於進制轉換,我覺得挺好玩的不就是幾個公式吧了,
就如我第一次所學的二進制轉換為十進制,十進制轉換為二進制,那樣的類型其實也挺有趣的
比如:一個二進制數轉化為十進制數,如哦我所給的一個二進制數「101101001」我就設十進制數是Z
首先有個公式可套:Z=1*X8+0*X7+1*X6+1*X5+0*X4+1*X3+0*X2+0*X1+1*X0
把只是X換為2,算出來的就是你所得到的此二進制數所對應的十進制數
同理:如八進制數轉換為十進制數就是把X換為8,十六進制數轉換十進制數把X換為16,
至於二進制數轉化為八進制數更有意思;
首先我引進一個例子:這是一個比較特殊的二進制數:111111111111
首先把這組數按三個數劃分一組(從右開始劃分):如,111,111,111,111 於是結果是7777
然後就分別把化為各組的數組轉化為是進制數,最後進把你剛才算出的數按原來的順序排起來,於是得到的結果就是你想要的
那十六進制就是把數組中的每四個劃分一組(從右開始劃分的)
如111111111111劃分結果為1111,1111,1111, 方法與上面一樣,於是它的結果是fff
關於十進制轉化二進制,八進制和十六進制,方法都是一樣的
同二進制方法雷同。
2. C語言進制轉換
很簡單的,
以下是各種進制的轉換方法:
兩個進制(其中之一為10進制)之間的互轉(手工計算方法)
以2,10進制互轉為例,其他請舉一反三:
二進制數1101轉十進制:
1×2的三次冪+1×2的二次冪+豎旦0×2的一次冪+1×2的零次冪=8+4+0+1=13
附加一個八進制轉十進制的例子吧:
507(八進制轉10進制):
5×8的2次冪+0×8的1次冪+7×8的0次冪=
5×64+0×8+7×1=327(跡纖運10進制)
以上是小進制向大進制的轉換,從2->10和8->10,下面說說大進制向小進制的轉換。(方法是相除去余)
10進制327轉八進制:
327/8 = 40 余數為7
40/8 = 5 余數為0
於是八進制數為507(第一位5是最後的商)
10進制13轉2進制:
13/2 = 6 余數為1
6/2 = 3 余數為0
3/2 = 1 余數為1
所以對應的二進制數為1101(第一位1是最後的商)
再測試一下,把307(10進制)轉換為16進制:
307/16 = 19 余數為3
19/16 = 1 余數為3
對應的16進制數應該是姿梁:133
再把133轉回10進制:
1×16的2次冪+3×16的1次冪+3×16的零次冪
=256+48+3=307
這是程序:
#include <stdio.h>
#define BASE 8 /*要轉換成幾進制數/*
#define DIGIT 100 /*轉換數的位數/*
int main(void)
{
int i,input;
int x[DIGIT];
printf("Please enter(Enter q to quit)")
while(scanf("%d",&input)==1)
{
for (i=0;input!=0;input/=BASE)
x[i]%=input;
for (;i<0;i--)
printf("%d",x[i]);
}
return 0;
}
要轉換成16進制只要改下BASE的值就有了。
3. c語言編程怎麼實現進制轉換
可以用直接法和間接法轉換。
4. C語言中的二進制、八進制、十進制之間的轉換
二進制的1101轉化成十進制
1101(2)=1*2^0+0*2^1+1*2^2+1*2^3=1+0+4+8=13
轉化成十進制要從右到左用二進制的每個數去乘以2的相應次方
不過次方要從0開始
十進制轉二進制:
用2輾轉相除至結果為1
將余數和最後的1從下向上倒序寫
就是結果
例如302
302/2
=
151
餘0
151/2
=
75
餘1
75/2
=
37
餘1
37/2
=
18
餘1
18/2
=
9
餘0
9/2
=
4
餘1
4/2
=
2
餘0
2/2
=
1
餘0
1/2
=
0
餘1
故二進制為100101110
二進制轉八進制
在把二進制數轉換為八進製表示形式時,對每三位二進制位進行分組,應該從小數點所在位置分別向左向右劃分,若整數部分倍數不是3的倍數,可以在最高位前面補若干個0;對小數部分,當其位數不是的倍數時,在最低位後補若干個0.然後從左到右把每組的八進制碼依次寫出,即得轉換結果.
你算一下就知道了啊
比如110=2^2+2+0=6
二進制轉十六進制
要將二進制轉為16進制,只需將二進制的位數由右向左每四位一個單位分隔,分的不夠的前邊補零,用四位數的二進制數來代表一個16進制。轉換表如下,括弧內為十六進制
0000(0)
0001
(1)
0010
(2)
0011
(3)
0100
(4)
0101
(5)
0110
(6)
0111
(7)
1000
(8)
1001
(9)
1010(A)
1011
(B)
1100
(C)
1101
(D)
1110
(E)
1111
(F)
例如:10101011劃分為1010
1011,根據轉換表十六進制為AB
5. C語言中的各進制的轉換方法
C++的,如果要TC的將中文改為English就行了
#include<stdio.h>
#include<math.h>
void ten_two()
{
int num, i;
int arr[20];
printf("請輸入一個十進制數:");
scanf("%d",&num);
for( i = 0 ; 1 ; i++)
{ //轉換為二進制並存入數組
arr[i] = num % 2;
num = num / 2;
if(num == 0)
{
break;
}
}
printf("轉換為二進制:"); //列印
for(; i >= 0 ; i-- ){
printf("%d",arr[i]);
}
printf("\n");
}
void ten_eight()
{
int num, i;
int arr[20];
printf("請輸入一個十進制數:");
scanf("%d",&num);
for( i = 0 ; 1 ; i++){//轉換為八進制並存入數組
arr[i] = num % 8;
num = num / 8;
if(num == 0){
break;
}
}
printf("轉換為八進制:"); //列印
for(; i >= 0 ; i-- ){
printf("%d",arr[i]);
}
printf("\n");
}
void ten_sixteen()
{
int num, i;
int arr[20];
printf("請輸入一個十進制數:");
scanf("%d",&num);
for( i = 0 ; 1 ; i++){ //轉換為二進制並存入數組
arr[i] = num % 16;
num = num / 16;
if(num == 0){
break;
}
}
printf("轉換為十六進制:"); //列印
for(; i >= 0 ; i-- ){
switch(arr[i]){
case 10 : printf("A");break;
case 11 :printf("B");break;
case 12 :printf("C");break;
case 13 :printf("D");break;
case 14 :printf("E");break;
case 15 :printf("F");break;
default :printf("%d",arr[i]);
}
}
printf("\n");
}
void two_ten()
{
long num;
int b,TheTen=0,Total=0;
printf("請輸入一個二進制數(只包含0或1):");
scanf("%ld",&num);
while(num)
{
b=num-(int)(num/10)*10;
TheTen+=b*pow(2,Total);;
Total++;
num=(int)(num/10);
}
printf("轉換為十進制:"); //列印
printf("%d",TheTen);
printf("\n");
}
void eight_ten()
{
int num, i;
int arr[20];
printf("請輸入一個八進制數(只由0~7之前的數組成):");
scanf("%o",&num);
printf("轉換為十進制:"); //列印
printf("%d",num);
printf("\n");
}
void sixteen_ten()
{
int num, i;
int arr[20];
printf("請輸入一個十六進制數(只由0~9和A~F之前的數組成):");
scanf("%X",&num);
printf("轉換為十進制:"); //列印
printf("%d",num);
printf("\n");
}
void main()
{
int select;
do{
printf("0 - 退出,1 - 十進制轉二進制,2 - 十進制轉八進制,3 - 十進制轉十六進制,4 - 二進制轉十進制,5 - 八進制轉十進制,6 - 十六進制轉十進制\n");
scanf("%d",&select);
switch(select){
case 1 : ten_two(); break; //十進制轉二進制
case 2 : ten_eight(); break; //十進制轉八進制
case 3 : ten_sixteen(); break; //十進制轉十六進制
case 4 : two_ten(); break; //二進制轉十進制
case 5 : eight_ten(); break; //八進制轉十進制
case 6 : sixteen_ten(); break; //六十進制轉十進制
default : printf("您的輸入有誤,請重新輸入!"); break;
}
if(select == 0)
{break;}
}while(1);
}
6. C語言中進制的表示和轉換
C語言中常用的有十進制、二進制、八進制(用0表示)、十六進制(用0x表示)。
十進制轉二進制:
十進制轉二進制採取除於2取余的方式。
將十進制數除於2得到商和余數,
將商繼續除於2一直到商為0,
將得到的余數倒敘排列就是轉換為二進制的結果
二進制轉十進制:
從右向左用二進制位上的每一個數乘以2的相應次方
如二進制1010轉換為十進制:
1010 = 0*(2的0次方)+1*(2的1次方)+0*(2的2次方)+1*(2的3次方) = 2 + 8 = 10
八進制轉換為二進制
將二進制數自右向左每三位分為一段(若不足三位用0補齊),
然後將二進制的每三位轉換為一位八進制數
如將二進制數0101010轉換為八進制:
0 101 010不夠三位的補0得到
000 101 010 = 052 = 0052(八進制用0表示)
十六進制轉換為二進制
將二進制數自右向左每四位分為一段(若不足三位用0補齊),
然後將二進制的每4位轉換為一位十六進制數
如將二進制數0101100轉換為十六進制:
010 1100不夠三位的補0得到
0010 1100 = 2C= 0x2C(十六進制用0x表示)
7. C語言之進制之間的轉換
計算機中一般是二進制敬罩爛、八進制、十進制和十六進制之間的相互轉換,主要是圍繞 二進制 進行轉換,也就是說 二進制 是核心。
[圖片上傳失敗...(image-9e6904-1533226303616)]
第一:間接法—把十進制轉成二進制,然後再由二進制轉成八進制或者十六進制。這里不再做圖片用法解釋。
第二:直接法—把十進制轉八進制或者十六進制按照除8或者16取余,直到商為0為止。
方法為:把八進制、十六進制數按權展開、相加即得十進制數。
第一種:他們之間的轉換可以先轉成二進制然後再相互轉換。
第二種:他們之間的轉換可以先轉成十進制然後再相互轉換。
數據在內存中存儲的時候都是以 二進制 的形式存儲的.int num = 10; 原碼、反碼、補碼都是二進制.只不過是二進制的不同的表現形式.數據是以 補碼 的二進制存儲的.
1個int類型的變數.在32位編譯器內存中占據4個位元組(這里不單獨討論int類型的具體的位元組數,若不明白看下面的拓展資料)
00000000 00000000 00000000 00000000
如果最高為是0 那麼表示這個數是1個正數
如果最高為是1 那麼表示這個數是1個負數
最高位表示符號位. 剩下的位數.是這個數的絕對值的二進制.
絕對值: 正數的絕對值是自己,負數的絕對值去掉負號.
正數的反碼就是其原碼.負數的反碼就亮漏是在其原碼的基礎之上 符號位不變,其他位取反.
正數的補碼就是其原碼.負數的補碼就是在其反碼的基礎之上+1
任何數據都是以其 二進制的補碼 形式存儲在內存中的
計算機中只有加法沒有減法.為了更加低成本的計算出結果,所以使用補碼來存儲數據.
3 - 2; 這個減法運悶沒算對於計算機而言它的理解是 3 + (-2);
8. C語言進制轉換
支持zpfloveyfy的分析,程序風格也很好。
我在這給個數制轉換的公式:
十進制數N和其他d進制數的轉換基於以下公式:
N
=
(N
div
d)
*
d
+
N
mod
d;
其中:div為整除,mod為求余。
例如將10進制1348轉化成2504,運算過程如下:
N
Ndiv8
Nmod8
1348
168
4
168
21
0
21
2
5
2
0
2
看起來有點亂,因為這里會把原來的格式給打亂。
由最後一列4052可以看出,正好是結果2504的倒數,所以用棧來實現它是最理想不過的了。
9. C語言進制轉換
計算機中常用的數的進制主要有:二進制、八進制、十進制、十六進制。
2進制,用兩個阿拉伯數字:0、1;
8進制,用八個阿拉伯數字:0、1、2、3、4、5、6、7;
10進制,用十個阿拉伯數字:0到9;
16進制就是逢16進1,但我們只有0~9這十個數字,所以我們用A,B,C,D,E,F這五個字母來分別表示10,11,12,13,14,15。字母不區分大小寫。
下面用余數短除法把十進制數轉化為二進制數為例進行說明
1、明確問題。舉個例子,我們現在是要將一個十進制數字156轉換成二進制數字。先將這個十進制數作為被除數寫在一個倒著的「長除法」的符號里。把目標數系的基數(在這里二進制是「2」)作為除數寫在這個除法符號的外面。用這個方法將計算過程可視化會更方便理解,因為整個計算過程只需將數字一直除以2。
活用這個方法可以將所有十進制數字轉換成任何進製表達。除數為2是因為我們最終想得到的以2為基數的數(即二進制數值) 。如果最終想得到其他數系的數字,用目標數系的基數代替這個方法里二進制的基數2 就可以了。例如,要得到基數為9的數,就用9來代替2作為除數 。最終的結果就是目標數系的數字表達。
(9)進制轉換表c語言擴展閱讀:
十進制--->二進制
對於整數部分,用被除數反復除以2,除第一次外,每次除以2均取前一次商的整數部分作被除數並依次記下每次的余數。另外,所得到的商的最後一位余數是所求二進制數的最高位。
對於小數部分,採用連續乘以基數2,並依次取出的整數部分,直至結果的小數部分為0為止。故該法稱「乘基取整法」
十進制--->八進制
10進制數轉換成8進制的方法,和轉換為2進制的方法類似,唯一變化:除數由2變成8。
10. C語言進制及其轉換
###常用的幾種進制:任何進制計數,高位都在左邊,右邊為低位,在高位前補0對於整個數的值得大小沒有影響,但絕對不可以在低位後補0,因為這樣會改變數的大小;
1.最常用的:十進制
要點 a:在十進制中的每一位數的取值范圍必須在0~9,如果其中某一位數超過9,則必須用多位數進行表示,其中低位和相鄰高位之間的運算關系遵守 「逢十進一」 ;
要點 b:運算
例:147.75=1*10^2+4*10^1+7*10^0+7*10^-1+5*10^-2
2.二進制:
要點 a:在二進制中,每一位只能在0~1中取,所以二進制的基數2,其中低位和相鄰的高位之間的運演算法則遵循 「逢二進一 」(像十進制的逢十進一樣);
要點 b:運算
例:101.1=1*2^2+0*2^1+1*2^0+1*2^-1=(5.5)10
要點 c:二進制的前綴為:0b或b開頭
3.八進制:
要點 a:八進制的每一位數只能在0~8中取一個,並且基數的基數是8,其中低位和相鄰的高位之間的運算關系遵循 「 逢八進一 」;
要點 b:運算
例:(12.4)8=1*8^1+2*8^0+4*8^-1=(10.5)10
要點 c :八進制的前綴為0;在八進制數字中的每一位數字在0~8區間;例:0157等
4.十六進制:
要點 a:十六進制數的每一位有16個不同的數碼,分別用0~9、A(10)、B(11)、C(12)、D(13)、
E(14)、F(15)表示。(A~F大小寫均可);計數的基數為16,其中低位和相鄰的高位之間的運算關系遵循 「逢十六進一」;
要點 b:運算
例:(2A.7F)16=2*16^1+10*16^0+7*16^-1+15*16^-2=(42.4960937)10
###進制之間的轉換:
1.二進制與十進制:
規則:以2為底,從低位向高位每一位進行2冪運算,再和與之對應的位進行乘法運算,然後求和;
例:01011011(八位的一個二進制數轉換為十進制數)
0 1 0 1 1 0 1 1
2^7 2^6 2^5 2^4 2^3 2^2 2^1 2^1
運算時只需將 0/1 下面相對應的以2為底的冪進行相乘後求和即可:
0*2^7+1*2^6+0*2^5+1*2^4+1*2^3+0*2^2+1*2^1+1*2^0=91;
例:將十進制數57轉換為二進制數:
十進制轉二進制就是對十進制數的一個以2為除數的求余過程:
57 / 2 =28……1
28 / 2 =14……0
14 / 2=7……0
7 / 2 =3……1
3 / 2 =1……1
2 / 2 =0…… 1
@注意: 在書寫二進制的結果時,要倒著寫 :即結果為:111001 或 00111001
2.二進制轉八進制:
對於二進制轉八進制來講,把二進制從低位向高位進行3位二進制數為一個單位進行劃分,也就是說
3位二進制對應1位八進制數。
421 421 421(快捷演算法)
例:二進制: 010 001 101 (與下面八進制的數字相對應)
八進制 : 2 1 5
其中 二進制的010對應的421中,因4對應0,1對應0,所以沒有值,1對應2,所以值為2,所以 以010這3個數為一個單位的數的值為2;二進制中101對應的421中,4對應1,2對應0,1對應1,所以 以101為一個單位的數的值為4+1=5;所以二進制數 010001101 對應的八進制數位 215;
八進制轉二進制:
同樣,只要逆向思維就可以了:一位八進制數對應3位二進制數;
例:八進制 2 1 5
二進制 010 001 101
421 421 421
0+2+0=2 0+0+1=1 4+0+1=5
寫結果時:一般會寫成10001101;程序員一般會將高位數前的0省略,值不變
3.二進制轉十六進制
要點: 對於二進制轉十六進制來講,把二進制從低位向高位進行4位二進制數 做為一個單位進行劃分,也就是說 4位二進制對應1位十六進制數。
例:將 01011110 二進制數轉換為十六進制數
8421 8421
二進制 0101 1110
十六進制 5 E
注釋:同理:5=8*0+4*1+2*0+1*1 E(14)=8*1+4*1+2*1+1*0
所以:寫法為 (01011110)2=(5E)16
十六進制轉二進制:
同樣,只要逆向思維就可以了: 一位十六進制數對應4位二進制數
例: 8 F A
1000 1111 1010
8421 8421 8421
8=8*1+4*0+2*0+1*0 F(15)=8*1+4*1+2*1+1*1 A(10)=8*1+4*0+2*1+1*0
所以:(8FA)16=(100011111010)2
###原碼、反碼、補碼
1.機器數:一個數在計算機中的二進製表現形式;機器數是帶符號的,在計算機用一個數的最高存放符號,正數為0,負數為1;如:十進制中的數+3,計算機字長尾8位,轉換成二進制數就是00000011.如果是-3,那就是10000011;那麼,這里的00000011和10000011就是機器數。
2.真值:因為第一位是符號位,所以機器數的形式值就不等於真正的數值。
3.原碼:原碼就是符號位加上真值的絕對值。
例:+1(原碼)=0000 0001
-1(原碼)=1000 0001
從中可以看出,對於二進制來說,最高位就是符號位,1就是代表的負數,0就代表正數,所以一個8位的二進制數它能表達的取值范圍應該是【11111111,01111111】;即【-127,127】但char類型佔一個位元組,所以取值范圍為【-128,127】
4.反碼:正數的原碼,反碼是一樣的;負數的反碼就是符號位不變,其他位在原碼的基礎上取反,即0變為1,1變為0.
原碼 反碼
+1 +0000 0001 0000 0001
-1 1000 0001 1111 1110
+0 0000 0000 0000 0000
-0 1000 0000 1111 1111
5.補碼:
正數的原碼、反碼、補碼就是其本身;負數的補碼是在其原碼的基礎上,符號位不變,其餘各取反,最後+1(即 在反碼的基礎上+1)
例 : 原碼 反碼 補碼
+1 0000 0001 0000 0001 0000 0001
-1 1000 0001 1111 1110 1111 1111
+0 0000 0000 0000 0000 0000 0000
-0 1000 0000 1111 11111 10000 0000
在最後一行中,-0的補碼得出來是一個9位的二進制數,由於我們測試的是8位,所以,應該把最
最高位捨去,因為數據在存儲的時候是由高到低進行存儲,所以-0的補碼應該是0000 0000
注意:在計算機存儲數據時,計算機是採用二進制 補碼的形式 進行存儲
#include <stdio.h>
int main(){
int x=1;//定義一個Int類型的變數名為x的變數
int y=~x;//~這個是取反符號
printf("%d\n",y);
return 0;
}
輸出結果為:-2