最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++進(jìn)制之間相互轉(zhuǎn)換實現(xiàn)方式

 更新時間:2025年09月12日 08:42:16   作者:lijiachang030718  
文章總結(jié)了進(jìn)制轉(zhuǎn)換的常見方法,區(qū)分整數(shù)與字符串處理:整數(shù)轉(zhuǎn)換依賴位運算或算術(shù)運算,字符串則先轉(zhuǎn)為十進(jìn)制或二進(jìn)制再處理,重點強(qiáng)調(diào)大數(shù)轉(zhuǎn)換需注意數(shù)據(jù)類型限制,如十六進(jìn)制轉(zhuǎn)八進(jìn)制的復(fù)雜性

引言

這個進(jìn)制轉(zhuǎn)換不論是面試還是競賽,還是比較常考的,然后就會有大類整數(shù),比如給你一個1e5長的十六進(jìn)制數(shù)讓你轉(zhuǎn)成八進(jìn)制,這就很難了,所以我先以最常見的,不會爆int的整數(shù),然后再說字符型的。因為其實本質(zhì)這個輸入的東西都是字符,只不過你以什么方式去讀入的,導(dǎo)致了他成了什么類型,為什么要區(qū)分整數(shù)和字符型的數(shù),因為字符型的數(shù)都是非常大的,通常是以長度來衡量大小的,連longlong也才18位而已,而字符通常有1e5那么長

一、用整數(shù)進(jìn)行類型轉(zhuǎn)換

1.任意進(jìn)制轉(zhuǎn)二進(jìn)制

這個其實 a a a 是作為一個二進(jìn)制數(shù)被存儲在計算機(jī)中,當(dāng)然可以通過位移運算符來得知二進(jìn)制中的每一位是什么,所以非常的容易

int main()
{
	int a = 10;
	vector<int> res;
	for (int i = 0; i < 32; ++i)
	{
		int t = a >> i & 1;
		res.push_back(t);
	}
	while (res.back() == 0) res.pop_back();
	for (int i = res.size() - 1; i >= 0; --i) printf("%d", res[i]);

	return 0;
}

測試:

可以看出一下都是正確的

  • 當(dāng)a為10

  • 當(dāng)a為0111

  • 當(dāng)a為0x111

2.任意進(jìn)制轉(zhuǎn)八進(jìn)制

這個還是利用了數(shù)字在計算機(jī)中是以二進(jìn)制的方式存儲的

void toOct(int x)
{
	vector<int> res;
	while (x)
	{
		int t = x - (x >> 3 << 3);
		res.push_back(t);
		x = x >> 3;
	}
	for (int i = res.size() - 1; i >= 0; --i) printf("%d", res[i]);
}

測試:

  • 當(dāng)a為10

  • 當(dāng)a為0b111

  • 當(dāng)a為0x111

3.任意進(jìn)制轉(zhuǎn)十進(jìn)制

其實不管是幾進(jìn)制,歸根結(jié)底它都是個數(shù),是數(shù)那么都可以進(jìn)行算術(shù)運算

void toDec(int x)
{
	vector<int> res;
	while (x)
	{
		res.push_back(x % 10);
		x /= 10;
	}
	for (int i = res.size() - 1; i >= 0; --i) printf("%d", res[i]);
}

測試

  • 當(dāng)a = 0b1111

  • 當(dāng)a = 01111

  • 當(dāng)a = 0xABCD

4.任意進(jìn)制轉(zhuǎn)十六進(jìn)制

其實都大同小異轉(zhuǎn)換的過程

void toHex(int x)
{
	const char str[20] = { "0123456789ABCDEF" };
	vector<char> res;
	while (x)
	{
		int t = x - (x >> 4 << 4);
		res.push_back(str[t]);
		x = x >> 4;
	}
	for (int i = res.size() - 1; i >= 0; --i) printf("%c", res[i]);
}

測試

可以看出都是正確的

  • 當(dāng)a = 0b11111111

  • 當(dāng)a = 145

  • 當(dāng)a = 0145

二、用字符串進(jìn)行類型之間的轉(zhuǎn)換

這里先只用說就是常規(guī)的字符了,就是標(biāo)準(zhǔn)形式的,而不是有空格或者有其它字符的不規(guī)范的字符

然后我這里一個簡單的思路就是先把所有的string類型轉(zhuǎn)成十進(jìn)制的整型,然后再用整型轉(zhuǎn)成其它類型

1.思路一:string -> int -> string

1.十六進(jìn)制字符串轉(zhuǎn)十進(jìn)制整型

int hexToDec(string num)
{
	int res = 0;
	for (int i = 0; i < num.size(); ++i)
	{
		if (num[i] >= '0' && num[i] <= '9')
		{
			res = res * 16 + num[i] - '0';
		}
		else if (num[i] >= 'A' && num[i] <= 'E')
		{
			res = res * 16 + num[i] - 'A' + 10;
		}
	}

	return res;
}

2.二進(jìn)制字符串轉(zhuǎn)十進(jìn)制整型

int binToDec(string num)
{
	int res = 0;
	for (int i = 0; i < num.size(); ++i)
	{
		res = res * 2 + num[i] - '0';
	}

	return res;
}

3.八進(jìn)制字符串轉(zhuǎn)十進(jìn)制整型

int octToDec(string num)
{
	int res = 0;
	for (int i = 0; i < num.size(); ++i)
	{
		res = res * 8 + num[i] - '0';
	}

	return res;
}

2.思路二:先轉(zhuǎn)為二進(jìn)制字符,再轉(zhuǎn)為其它進(jìn)制

這里我就演示十六進(jìn)制轉(zhuǎn)為八進(jìn)制的吧,這個也是最難的

#include <iostream>

using namespace std;

string hexToBin(string s)
{
	string res;
	for (int i = 0; i < s.size(); ++i)
	{
		switch (s[i])
		{
		case '0': res += "0000"; break;
		case '1': res += "0001"; break;
		case '2': res += "0010"; break;
		case '3': res += "0011"; break;
		case '4': res += "0100"; break;
		case '5': res += "0101"; break;
		case '6': res += "0110"; break;
		case '7': res += "0111"; break;
		case '8': res += "1000"; break;
		case '9': res += "1001"; break;
		case 'A':
		case 'a': res += "1010"; break;
		case 'B':
		case 'b': res += "1011"; break;
		case 'C':
		case 'c': res += "1100"; break;
		case 'D':
		case 'd': res += "1101"; break;
		case 'E':
		case 'e': res += "1110"; break;
		case 'F':
		case 'f': res += "1111"; break;
		}
	}
	return res;
}

string binToOct(string s)
{
	if (s.size() % 3 == 1) s = "00" + s;
	else if (s.size() % 3 == 2) s = "0" + s;
	string res;

	for (int i = 0; i < s.size(); i += 3)
	{
		res += s[i + 2] + (s[i + 1] - '0') * 2 + (s[i] - '0') * 4;
	}

	return res;
}

int main()
{
	int n;

	cin >> n;
	while (n--)
	{
		string a;
		cin >> a;
		string res = binToOct(hexToBin(a));
		while(res[0] == '0') res = res.substr(1, res.size() - 1);  //防止前導(dǎo)0
		cout << res << endl;
	}

	return 0;
}

經(jīng)過測試也是正確的

總結(jié)

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • c++圖像處理:24位真彩圖顏色變換實例

    c++圖像處理:24位真彩圖顏色變換實例

    下面小編就為大家?guī)硪黄猚++圖像處理:24位真彩圖顏色變換實例。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-01-01
  • 深入理解strcpy與memcpy的區(qū)別

    深入理解strcpy與memcpy的區(qū)別

    本篇文章是對strcpy與memcpy的區(qū)別進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • C語言實例之雙向鏈表增刪改查

    C語言實例之雙向鏈表增刪改查

    雙向鏈表(Doubly Linked List)是一種常見的數(shù)據(jù)結(jié)構(gòu),在單鏈表的基礎(chǔ)上增加了向前遍歷的功能,與單向鏈表不同,雙向鏈表的每個節(jié)點除了包含指向下一個節(jié)點的指針外,還包含指向前一個節(jié)點的指針,本文給大家介紹了C語言中雙向鏈表的增刪改查
    2023-08-08
  • C++存儲方案和動態(tài)分配

    C++存儲方案和動態(tài)分配

    這篇文章主要介紹了C++存儲方案和動態(tài)分配,
    2021-12-12
  • 隨機(jī)數(shù)字去掉重復(fù)和排序的方法

    隨機(jī)數(shù)字去掉重復(fù)和排序的方法

    用計算機(jī)隨機(jī)生成了N個0到1000000000(包含0和1000000000)之間的隨機(jī)整數(shù)(N≤5000000),對于其中重復(fù)的數(shù)字,只保留一個,把其余相同的數(shù)去掉。然后再把這些數(shù)從小到大排序。
    2013-03-03
  • 分享C++面試中string類的一種正確寫法

    分享C++面試中string類的一種正確寫法

    C++ 的一個常見面試題是讓你實現(xiàn)一個 String 類,限于時間,不可能要求具備 std::string 的功能,但至少要求能正確管理資源
    2013-11-11
  • C++之編寫高效Makefile文件最佳方法

    C++之編寫高效Makefile文件最佳方法

    在軟件開發(fā)過程中,Makefile是一個非常重要的工具,它可以幫助我們自動化構(gòu)建、編譯、測試和部署,然而,編寫高效的Makefile文件并不是一件容易的事情。在本文中,我們將討論如何編寫高效的Makefile文件,以提高開發(fā)效率和產(chǎn)品質(zhì)量,需要的朋友可以參考下
    2023-05-05
  • C++私有繼承與EBO深入分析講解

    C++私有繼承與EBO深入分析講解

    這篇文章主要介紹了C++私有繼承,在私有繼承當(dāng)中,基類的公有成員和保護(hù)成員都會成為派生類的私有成員。這意味著基類的方法都會被private關(guān)鍵字描述,我們可以在派生類中使用它,但類對象無法直接調(diào)用,下面來看看詳細(xì)內(nèi)容吧
    2022-08-08
  • C++堆排序算法實例詳解

    C++堆排序算法實例詳解

    這篇文章主要介紹了C++堆排序算法,簡單分析了堆排序算法的原理并結(jié)合實例形式分析了C++實現(xiàn)堆排序的具體操作技巧,需要的朋友可以參考下
    2017-08-08
  • C語言實現(xiàn)密碼本小項目

    C語言實現(xiàn)密碼本小項目

    這篇文章主要為大家詳細(xì)介紹了C語言實現(xiàn)密碼本小項目,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-02-02

最新評論

阜宁县| 成武县| 怀集县| 根河市| 姜堰市| 高密市| 韶关市| 泸水县| 博客| 安泽县| 金湖县| 临城县| 霸州市| 嘉黎县| 柯坪县| 攀枝花市| 泽州县| 察雅县| 鄂州市| 大竹县| 嘉兴市| 三都| 六盘水市| 安庆市| 岐山县| 桂平市| 临汾市| 南召县| 万荣县| 石首市| 繁昌县| 靖州| 资溪县| 武乡县| 佳木斯市| 庄河市| 平原县| 昌都县| 英超| 禹州市| 岗巴县|