十六進制與十進制對照
十六進制 | 十進制 |
0 | 0 |
1 | 1 |
2 | 2 |
3 | 3 |
4 | 4 |
5 | 5 |
6 | 6 |
7 | 7 |
8 | 8 |
9 | 9 |
A | 10 |
B | 11 |
C | 12 |
D | 13 |
E | 14 |
F | 15 |
十六進制與十進制區別
十六進制是滿16進1,十進制是滿10進1,這里要注意下區別,16進制的字符里面為什么是0-9沒有10,這里面進了一位,表示16了。
十六進制轉十進制的算法邏輯
處理轉換過程分為正序和逆序
正序
從左到右加權累加,每次往右加一個數的時候,原來的數字需要向左變高位移動一位,就是乘以16。比如有一個“1A3”,result記錄十進制累加值初始為0,
我們遍歷第一次,是1進來:
result=result*16+1=0*16+1=1
第二次,A進來==10,1左移一位:
result=result*16+10=1*16+10=26
第三次,3進來,1A左移一位:
result=result*16+3=26*16+3=419
整體公式其實就是:
result=1*16^2+A*16^1+3*16^0
實現
int hexToDecimalManual(const std::string& hexStr) {int result = 0;size_t startIdx = (hexStr.substr(0, 2) == "0x" || hexStr.substr(0, 2) == "0X") ? 2 : 0;for (size_t i = startIdx; i < hexStr.size(); ++i) {char c = hexStr[i];int value;if (isdigit(c)) {value = c - '0';} else if (c >= 'A' && c <= 'F') {value = 10 + c - 'A';} else if (c >= 'a' && c <= 'f') {value = 10 + c - 'a';} else {break; // 非法字符終止轉換}result = result * 16 + value; // 逆序權值累加}return result;
}
逆序
逆序是從右到左遍歷字符串,有一個base記錄處理的權值,每次引入的字符都是更高位的字符,需要做一個權值處理,實現起來和正序差不多,注意方向就行
實現
long long hexToDecimal_Reverse(const string& hex) {long long result = 0;long long base = 1; // 初始權值為16^0=1for (int i = hex.length() - 1; i >= 0; i--) {char c = hex[i];int val;if (c >= '0' && c <= '9') {val = c - '0';} else if (c >= 'A' && c <= 'F') {val = 10 + c - 'A';} else if (c >= 'a' && c <= 'f') {val = 10 + c - 'a';} else {throw invalid_argument("非法十六進制字符");}// 動態調整權值result += val * base;base *= 16; // 權值左移(如1→16→256)}return result;
}// 示例輸入:hex = "1A3" → 輸出419
不建議使用math庫的pow,復雜度高了