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

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

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

引言

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

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

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

這個(gè)其實(shí) a a a 是作為一個(gè)二進(jìn)制數(shù)被存儲(chǔ)在計(jì)算機(jī)中,當(dāng)然可以通過位移運(yùn)算符來得知二進(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;
}

測(cè)試:

可以看出一下都是正確的

  • 當(dāng)a為10

  • 當(dāng)a為0111

  • 當(dāng)a為0x111

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

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

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]);
}

測(cè)試:

  • 當(dāng)a為10

  • 當(dāng)a為0b111

  • 當(dāng)a為0x111

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

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

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]);
}

測(cè)試

  • 當(dāng)a = 0b1111

  • 當(dāng)a = 01111

  • 當(dāng)a = 0xABCD

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

其實(shí)都大同小異轉(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]);
}

測(cè)試

可以看出都是正確的

  • 當(dāng)a = 0b11111111

  • 當(dāng)a = 145

  • 當(dāng)a = 0145

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

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

然后我這里一個(gè)簡(jiǎn)單的思路就是先把所有的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)制的吧,這個(gè)也是最難的

#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)過測(cè)試也是正確的

總結(jié)

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

相關(guān)文章

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

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

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

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

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

    C語(yǔ)言實(shí)例之雙向鏈表增刪改查

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

    C++存儲(chǔ)方案和動(dòng)態(tài)分配

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

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

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

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

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

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

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

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

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

    C++堆排序算法實(shí)例詳解

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

    C語(yǔ)言實(shí)現(xiàn)密碼本小項(xiàng)目

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

最新評(píng)論

黄大仙区| 中西区| 朝阳区| 西充县| 长海县| 兴和县| 武陟县| 长沙县| 石渠县| 崇信县| 密云县| 清流县| 广水市| 嵊泗县| 颍上县| 金湖县| 马公市| 沧州市| 行唐县| 砀山县| 贡山| 阿拉尔市| 育儿| 门头沟区| 云阳县| 广元市| 信宜市| 新巴尔虎右旗| 从江县| 依兰县| 双柏县| 庆城县| 阜宁县| 贺州市| 张家口市| 长沙县| 泾川县| 黄骅市| 无为县| 申扎县| 南投市|