溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

C語言之進制轉(zhuǎn)換

發(fā)布時間:2020-07-16 04:40:35 來源:網(wǎng)絡(luò) 閱讀:723 作者:師趣妮 欄目:編程語言
/*語言中進制表示?:
????二進制表示?:?在二進制數(shù)字前面加上0b;
????八進制表示?:?在八進制數(shù)字前面加上0;
????十六進制表示?:?在十六進制前面加上0x;
進制轉(zhuǎn)換?;
????將其他進制轉(zhuǎn)換成八進制?:?在printf函數(shù)中以%o占位;
????將其他進制轉(zhuǎn)換成十六進制?:?在printf函數(shù)中以%x占位;
????在C語言中,沒有占位符可將其他進制轉(zhuǎn)換成二進制;
????將其他進制轉(zhuǎn)換成十進制?:?在printf函數(shù)中以%i或%d占位;
進制轉(zhuǎn)換的原理公式?:?假定m為一個十進制數(shù),轉(zhuǎn)換成nk,nk-1,nk-2,...,n2,n1,n0的l進制數(shù)
?????????????????????則?m?=?n0?+?n1?*?l^1?+?n2?*?l^2?+?....?+?nk-2?*?l^(k-2)?+?nk-1?*?l?^(k-1)?+?nk?*?l^k
?????????????????????由上可見,當(dāng)?shù)仁阶笥覂啥送瑫r除以l時,余項為n0,在整數(shù)部分除以l則余項為n1,以此類推,便可以得到m的l進制表達(dá)
案例:十進制轉(zhuǎn)換二進制(逆序打印)
#include?<stdio.h>
void?printBin(int?num);
int?main(int?argc,?const?char?*?argv[])?{???
????int?num?=?4;?//?100;
????printBin(num);
????return?0;
}
void?printBin(int?num)
{
????int?zheng?=?num;
????while?(zheng?!=?0)
????{
????????int?yu?=?zheng?%?2;
????????printf("%i",yu);
????????zheng?=?zheng?/?2;
????}
????printf("\n");
}
n為二進制的取值范圍?:?0~2^n?-1
二進制轉(zhuǎn)八進制?:?三位變一位
二進制轉(zhuǎn)十六進制?:?四位變一位
原碼?反碼?補碼
????數(shù)據(jù)內(nèi)存中均是以補碼形式存儲,正數(shù)的原碼,反碼,補碼全部一樣,三碼合一
????原碼?:?最高位為符號位(正數(shù)為0,負(fù)數(shù)為1),其他位則為數(shù)字位
????反碼?:?負(fù)數(shù)的反碼,最高位符號位不變,數(shù)字位取反
????補碼?:?負(fù)數(shù)的補碼,反碼加1
位運算符?:
????按位與?:?&????#數(shù)字轉(zhuǎn)換成二進制后,對應(yīng)位,全真則真,由此可見,任何數(shù)字和1的按位與還是數(shù)字本身????#注?:?可用此法結(jié)合移位運算進行進制轉(zhuǎn)換
????按位或?:?|????#數(shù)字轉(zhuǎn)換成二進制后,對應(yīng)位上,一真則真,由此可見,任何數(shù)字和0的按位或還是數(shù)字本身
????按位異或?:?^????#數(shù)字轉(zhuǎn)換成二進制后,對應(yīng)位上,相同則取0,不同則取1.相同的兩個數(shù)字按位異或結(jié)果為0,且按位異或滿足交換律????#應(yīng)用?:?交換兩個變量的值
????取反?:?^????#取反操作,是直接對存儲在內(nèi)存中的補碼進行取反,因此要獲得數(shù)字本身,還需將其轉(zhuǎn)換成原碼之后,再計算
????左移?:?<<????#將二進制整體左移n位,缺位補0,相當(dāng)于原來的數(shù)字乘以2^n
????右移?:?>>????#將二進制除了符號位之外整體右移n位,缺位按照符號位的取值進行補齊,相當(dāng)于原來的數(shù)字乘以2^n
????????#注?:?左移或右移操作均是對補碼進行操作
案例一?:?交換變量的值
????方法一?:
???????int?num1?=?32;
???????int?num2?=?21;
???????int?temp?=?num1?+?num2;
???????num1?=?temp?-?num1;
???????num2?=?temp?-?num1;
????方法二?:
????????int?num1?=?32;
????????int?num2?=?21;
????????int?temp?=?num1?^?num2;
????????num1?=?temp?^?num1;
????????num2?=?temp?^?num1;
案例二?:?進制轉(zhuǎn)換?:
????方法一(正序打印,完全按照其在內(nèi)存的存儲方式進行顯示)?:
????????void?printBin(int?num);
????????int?num?=?3;????
????????printBin(num);
????????void?printBin(int?num)
???????{
??????????int?delta?=?31;
??????????for?(int?i?=?delta;i?>=?0;i--)
??????????{
?????????????int?result?=?(num?>>?i)?&?1;
?????????????printf("%i",result);
????????
?????????????if?(i?%?4?==?0)
?????????????{
?????????????????printf("?");
?????????????}
??????????}
???????printf("\n");
???????}
????方法二(逆序打印)?:
????????void?printBin(int?num);
????????int?num?=?3;
????????????printBin(num);
????????????void?printBin(int?num)
????????????{
????????????????int?delta?=?0;
????????????????for(int?i?=?delta;i?<?32;i++)
???????????????{
????????????????????if?(i?%?4?==?0)
???????????????????{
???????????????????????printf("?");
???????????????????}
???????????????????int?result?=?(num?>>?i)?&?1;
???????????????????printf("%i",result);
???????????????}
???????????????printf("\n");
????????????}
????????????#以上兩種方法的缺陷?:?當(dāng)數(shù)字較少,會打印大量無用的0
????????????方法三(改進)?:
?????????????void?printBin(int?num);
?????????????int?num?=?-4;
?????????????printBin(num);
?????????????void?printBin(int?num)
????????????{
????????????????int?count?=?0?;
????????????????while((num?>>?count)?!=?0)
????????????????{
?????????????????????int?result?=?(num?>>?count)?&?1;
?????????????????????printf("%i",result);
?????????????????????count++;
????????????????}
????????????????printf("\n");
???????????}
*/


向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI