成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

進(jìn)制轉(zhuǎn)換

Songlcy / 1988人閱讀

摘要:導(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

相關(guān)文章

  • 用javascript自己寫一個(gè)進(jìn)制轉(zhuǎn)換小工具

    摘要:進(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...

    fobnn 評(píng)論0 收藏0
  • 淺談JavaScript位操作符

    摘要:有符號(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ǔ),所以位操作符的作用也就是...

    fasss 評(píng)論0 收藏0
  • WebSocket系列之字符串如何與二進(jìn)制數(shù)據(jù)間進(jìn)行互相轉(zhuǎn)換

    摘要:總結(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)換為...

    stackfing 評(píng)論0 收藏0
  • 《javascript高級(jí)程序設(shè)計(jì)》筆記:Number數(shù)值轉(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)換為...

    kid143 評(píng)論0 收藏0
  • 原生JS大揭秘—揭開數(shù)據(jù)類型轉(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...

    Moxmi 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<