摘要:導言進制轉換是一道經典的題,基本概念不多說,像下面這樣進制進制進制進制注意進制不同時,數值還是一樣大的。當然,這并不是我們想要的,我們希望自己實現一個進制轉換的函數。
導言
進制轉換是一道經典的題,基本概念不多說,像下面這樣
12(10進制) <=> C(16進制) <=> 1100(2進制) <=> 14(8進制)
注意進制不同時,數值還是一樣大的。因此C(16進制)只是12(10進制)的另一種表示,而不是另一個數值。其實我的意思是,表示10進制外的其他進制時都應該用字符串。
因此一般有兩種情況
1. 10進制整數轉換為其他進制字符串
2. 其他進制字符串轉換為10進制整數
對于10進制整數轉換為8進制或16進制字符串時,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"
對于其他進制字符串轉換為10進制整數,Java已經提供了完美的方法。
// Java int num = Integer.parseInt("C", 16); // num == 12
當然,這并不是我們想要的,我們希望自己實現一個進制轉換的函數。
10進制整數轉換為其他進制字符串先舉個栗子——我們是怎么把111(10進制)轉換為157(8進制)的呢,其實就是一般的除法。
1. 比111小的最大的8的冪次是64
2. 111 / 64 = 1 ... 47
3. 47 / 8 = 5 ... 7
4. 7 / 1 = 7 ... 0
把3次除法的商連起來就是157(8進制)
算法上的思路跟這個完全一樣(如果下面這段看著難受請直接看代碼)
1. 假設要被轉換的10進制數是num,進制是base,轉換結果是result
2. 找到比num小的最大的base^n
3. result的第i位為num / base^(n-i)的商
4. num = num % base^(n-i),即余數作為下一輪的被除數
5. i++并回到第3部除非除數等于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語言的這個版本有個問題,為什么要傳個char *dest進去呢?我該怎么調用呢?
正確的調用姿勢是下面這樣的,至于為什么,請看我將來要寫的一篇文章——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; }其他進制字符串轉換為10進制整數
這個就比較簡單了,用一個表達式就是(假設字符串是a,有n位)
T[n] = a[0]*base^(n-1) + a[1]*base^(n-2) + ... + a[n-2]*base + a[n-1]
轉化成迭代的式子就是
T[0] = 0 T[i+1] = base*T[i] + a[i]
轉化成程序就是
/* 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; }
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/64196.html
摘要:進制轉換本身自帶進制轉換功能,支持進制的轉換注意,不能直接使用因為數字后面小數點后面會被識別成小數點的點將十進制的轉換成進制,結果是將進制的轉換成進制,結果是將十進制的轉換成進制,結果是將進制的轉換成進制,結果是將十進制的轉換成進制,結果 JavaScript進制轉換 JavaScript本身自帶進制轉換功能,支持2-36進制的轉換 // 注意,不能直接使用 11.toString(1...
摘要:有符號的右移操作符由兩個大于符號表示這個操作符的含義就是將數值的位向右移指定的位數同時保留符號位的值正負號標記有符號的右移操作符與左移操作符剛好相反比如向右移動位就是同樣的在移位的過程中也會出 位操作符的基本概念 因為ECMAscript中所有數值都是以IEEE-75464格式存儲,所以才會誕生了位操作符的概念. 位操作符作用于最基本的層次上,因為數值按位存儲,所以位操作符的作用也就是...
摘要:總結通過使用和,我們能夠在數據和二進制數據中進行互相轉換。下一篇系列相關的博客,將會介紹如何通過來向后端傳遞二進制數據,以及如何處理通過收到的二進制數據。 概述 上一篇博客我們說到了如何進行數字類型(如Short、Int、Long類型)如何在JavaScript中進行二進制轉換,如果感興趣的可以可以閱讀本系列第二篇博客——WebSocket系列之JavaScript中數字數據如何轉換為...
摘要:數值轉換對個人而言是非常重要的,這也是本人單獨拉出來總結的一個原因。在此也僅針對顯示轉換做點文章,隱式轉換同樣會單獨拉出來總結有個函數可以把非數值轉換為數值和。如果是值,和將分別被轉換為和。如果是數字值,只是簡單的傳入和返回。 數值轉換對個人而言是非常重要的,這也是本人單獨拉出來總結的一個原因。在此也僅針對顯示轉換做點文章,隱式轉換同樣會單獨拉出來總結 有 3 個函數可以把非數值轉換為...
摘要:可以將其他類型轉成字符串函數可以將任意類型的值轉為布爾值。提示空數組空對象轉換為布爾型也是。 在JS中數據類型轉換有兩種 相關資料參閱 官方ecma-5規范阮一峰老師類型轉換規范對相等==定義 強制類型轉換Number() Number函數將字符串轉為數值,要比parseInt函數嚴格很多,只要有一個字符是非數字(空格、+、-除外),那么就會被轉為NaN。 showImg(http...
閱讀 1754·2021-11-25 09:43
閱讀 1789·2021-11-24 10:41
閱讀 3108·2021-09-27 13:36
閱讀 815·2019-08-30 15:53
閱讀 3573·2019-08-30 15:44
閱讀 869·2019-08-30 14:03
閱讀 2578·2019-08-29 16:38
閱讀 1003·2019-08-29 13:23