摘要:導(dǎo)言進(jìn)制轉(zhuǎn)換是一道經(jīng)典的題,基本概念不多說,像下面這樣進(jìn)制進(jìn)制進(jìn)制進(jìn)制注意進(jìn)制不同時(shí),數(shù)值還是一樣大的。當(dāng)然,這并不是我們想要的,我們希望自己實(shí)現(xiàn)一個(gè)進(jìn)制轉(zhuǎn)換的函數(shù)。
導(dǎo)言
進(jìn)制轉(zhuǎn)換是一道經(jīng)典的題,基本概念不多說,像下面這樣
12(10進(jìn)制) <=> C(16進(jìn)制) <=> 1100(2進(jìn)制) <=> 14(8進(jìn)制)
注意進(jìn)制不同時(shí),數(shù)值還是一樣大的。因此C(16進(jìn)制)只是12(10進(jìn)制)的另一種表示,而不是另一個(gè)數(shù)值。其實(shí)我的意思是,表示10進(jìn)制外的其他進(jìn)制時(shí)都應(yīng)該用字符串。
因此一般有兩種情況
1. 10進(jìn)制整數(shù)轉(zhuǎn)換為其他進(jìn)制字符串
2. 其他進(jìn)制字符串轉(zhuǎn)換為10進(jìn)制整數(shù)
對(duì)于10進(jìn)制整數(shù)轉(zhuǎn)換為8進(jìn)制或16進(jìn)制字符串時(shí),C和Java里都有偷懶的辦法
/* C */ int num = 12; char oct_str[100]; char hex_str[100]; sprintf(oct_str, "%o", num); /* oct_str == "14" */ sprintf(hex_str, "%x", num); /* hex_str == "C" */ /* or printf */
// Java int num = 12; String octStr = Integer.toOctalString(num); // octStr == "14" String hexStr = Integer.toHexString(num); // hexStr == "C"
對(duì)于其他進(jìn)制字符串轉(zhuǎn)換為10進(jìn)制整數(shù),Java已經(jīng)提供了完美的方法。
// Java int num = Integer.parseInt("C", 16); // num == 12
當(dāng)然,這并不是我們想要的,我們希望自己實(shí)現(xiàn)一個(gè)進(jìn)制轉(zhuǎn)換的函數(shù)。
10進(jìn)制整數(shù)轉(zhuǎn)換為其他進(jìn)制字符串先舉個(gè)栗子——我們是怎么把111(10進(jìn)制)轉(zhuǎn)換為157(8進(jìn)制)的呢,其實(shí)就是一般的除法。
1. 比111小的最大的8的冪次是64
2. 111 / 64 = 1 ... 47
3. 47 / 8 = 5 ... 7
4. 7 / 1 = 7 ... 0
把3次除法的商連起來就是157(8進(jìn)制)
算法上的思路跟這個(gè)完全一樣(如果下面這段看著難受請(qǐng)直接看代碼)
1. 假設(shè)要被轉(zhuǎn)換的10進(jìn)制數(shù)是num,進(jìn)制是base,轉(zhuǎn)換結(jié)果是result
2. 找到比num小的最大的base^n
3. result的第i位為num / base^(n-i)的商
4. num = num % base^(n-i),即余數(shù)作為下一輪的被除數(shù)
5. i++并回到第3部除非除數(shù)等于0
/* C */ char *itos(int num, int base, char *dest) { int i, divisor = 1; char *table = "0123456789ABCDEF"; while (divisor * base <= num) { divisor *= base; } for (i = 0; divisor >= 1; i++, divisor /= base) { dest[i] = table[num/divisor]; num %= divisor; } dest[i] = 0; return dest; }
等等你說C語言的這個(gè)版本有個(gè)問題,為什么要傳個(gè)char *dest進(jìn)去呢?我該怎么調(diào)用呢?
正確的調(diào)用姿勢(shì)是下面這樣的,至于為什么,請(qǐng)看我將來要寫的一篇文章——C語言中的字符串與指針。
char str[100]; itos(255, 16, str); printf("%s", str); /* prints "FF" */
Java版本的代碼
// Java public static String itos(int num, int base) { int divisor = 1; byte[] table = "0123456789ABCDEF".getBytes(); String result = ""; while (divisor * base <= num) { divisor *= base; } for (; divisor >= 1; divisor /= base) { result += (char) table[num/divisor]; num %= divisor; } return result; }其他進(jìn)制字符串轉(zhuǎn)換為10進(jìn)制整數(shù)
這個(gè)就比較簡(jiǎn)單了,用一個(gè)表達(dá)式就是(假設(shè)字符串是a,有n位)
T[n] = a[0]*base^(n-1) + a[1]*base^(n-2) + ... + a[n-2]*base + a[n-1]
轉(zhuǎn)化成迭代的式子就是
T[0] = 0 T[i+1] = base*T[i] + a[i]
轉(zhuǎn)化成程序就是
/* C */ int stoi(const char *src, int base) { int i, digit, result = 0; for (i = 0; i < strlen(src); i++) { if (src[i] >= "a") { digit = src[i] - "a" + 10; } else if (src[i] >= "A") { digit = src[i] - "A" + 10; } else { digit = src[i] - "0"; } result = base*result + digit; } return result; }
// Java public static int stoi(String src, int base) { int digit, result = 0; for (int i = 0; i < src.length(); i++) { char c = src.charAt(i); if (c >= "a") { digit = c - "a" + 10; } else if (c >= "A") { digit = c - "A" + 10; } else { digit = c - "0"; } result = base*result + digit; } return result; }
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/64196.html
摘要:進(jìn)制轉(zhuǎn)換本身自帶進(jìn)制轉(zhuǎn)換功能,支持進(jìn)制的轉(zhuǎn)換注意,不能直接使用因?yàn)閿?shù)字后面小數(shù)點(diǎn)后面會(huì)被識(shí)別成小數(shù)點(diǎn)的點(diǎn)將十進(jìn)制的轉(zhuǎn)換成進(jìn)制,結(jié)果是將進(jìn)制的轉(zhuǎn)換成進(jìn)制,結(jié)果是將十進(jìn)制的轉(zhuǎn)換成進(jìn)制,結(jié)果是將進(jìn)制的轉(zhuǎn)換成進(jìn)制,結(jié)果是將十進(jìn)制的轉(zhuǎn)換成進(jìn)制,結(jié)果 JavaScript進(jìn)制轉(zhuǎn)換 JavaScript本身自帶進(jìn)制轉(zhuǎn)換功能,支持2-36進(jìn)制的轉(zhuǎn)換 // 注意,不能直接使用 11.toString(1...
摘要:有符號(hào)的右移操作符由兩個(gè)大于符號(hào)表示這個(gè)操作符的含義就是將數(shù)值的位向右移指定的位數(shù)同時(shí)保留符號(hào)位的值正負(fù)號(hào)標(biāo)記有符號(hào)的右移操作符與左移操作符剛好相反比如向右移動(dòng)位就是同樣的在移位的過程中也會(huì)出 位操作符的基本概念 因?yàn)镋CMAscript中所有數(shù)值都是以IEEE-75464格式存儲(chǔ),所以才會(huì)誕生了位操作符的概念. 位操作符作用于最基本的層次上,因?yàn)閿?shù)值按位存儲(chǔ),所以位操作符的作用也就是...
摘要:總結(jié)通過使用和,我們能夠在數(shù)據(jù)和二進(jìn)制數(shù)據(jù)中進(jìn)行互相轉(zhuǎn)換。下一篇系列相關(guān)的博客,將會(huì)介紹如何通過來向后端傳遞二進(jìn)制數(shù)據(jù),以及如何處理通過收到的二進(jìn)制數(shù)據(jù)。 概述 上一篇博客我們說到了如何進(jìn)行數(shù)字類型(如Short、Int、Long類型)如何在JavaScript中進(jìn)行二進(jìn)制轉(zhuǎn)換,如果感興趣的可以可以閱讀本系列第二篇博客——WebSocket系列之JavaScript中數(shù)字?jǐn)?shù)據(jù)如何轉(zhuǎn)換為...
摘要:數(shù)值轉(zhuǎn)換對(duì)個(gè)人而言是非常重要的,這也是本人單獨(dú)拉出來總結(jié)的一個(gè)原因。在此也僅針對(duì)顯示轉(zhuǎn)換做點(diǎn)文章,隱式轉(zhuǎn)換同樣會(huì)單獨(dú)拉出來總結(jié)有個(gè)函數(shù)可以把非數(shù)值轉(zhuǎn)換為數(shù)值和。如果是值,和將分別被轉(zhuǎn)換為和。如果是數(shù)字值,只是簡(jiǎn)單的傳入和返回。 數(shù)值轉(zhuǎn)換對(duì)個(gè)人而言是非常重要的,這也是本人單獨(dú)拉出來總結(jié)的一個(gè)原因。在此也僅針對(duì)顯示轉(zhuǎn)換做點(diǎn)文章,隱式轉(zhuǎn)換同樣會(huì)單獨(dú)拉出來總結(jié) 有 3 個(gè)函數(shù)可以把非數(shù)值轉(zhuǎn)換為...
摘要:可以將其他類型轉(zhuǎn)成字符串函數(shù)可以將任意類型的值轉(zhuǎn)為布爾值。提示空數(shù)組空對(duì)象轉(zhuǎn)換為布爾型也是。 在JS中數(shù)據(jù)類型轉(zhuǎn)換有兩種 相關(guān)資料參閱 官方ecma-5規(guī)范阮一峰老師類型轉(zhuǎn)換規(guī)范對(duì)相等==定義 強(qiáng)制類型轉(zhuǎn)換Number() Number函數(shù)將字符串轉(zhuǎn)為數(shù)值,要比parseInt函數(shù)嚴(yán)格很多,只要有一個(gè)字符是非數(shù)字(空格、+、-除外),那么就會(huì)被轉(zhuǎn)為NaN。 showImg(http...
閱讀 1760·2021-11-25 09:43
閱讀 1797·2021-11-24 10:41
閱讀 3115·2021-09-27 13:36
閱讀 821·2019-08-30 15:53
閱讀 3579·2019-08-30 15:44
閱讀 872·2019-08-30 14:03
閱讀 2583·2019-08-29 16:38
閱讀 1007·2019-08-29 13:23