我现在正在读一本C++的书,从一开始就学习它。我已经掌握了编码知识,但我真的很想通过尽可能多地从自己的代码中编写代码来深入学习C++,而不是总是使用库。)当我在学习的时候。我稍后会使用图书馆。)
我目前正在读有关模特儿的文章。当我阅读的时候,我试着做一些练习来应用我刚读到的东西。但是,这一次我失去了控制,它远离了我正在练习的东西(转换),但是代码很有趣。编辑我将阅读Different casts。-谢谢@Chnossos
在编写这些代码的过程中,我学到了很多东西,比如字符串流、反向等。
这是一个简单的int to base 2,我想知道是否有优化代码的方法,或者它是否可以像这样正确。
如果能通过优化代码了解更多知识,看看专家们在做些什么,那就太棒了。
谢谢。
#include <iostream>
#include <iomanip>
#include <sstream>
using namespace std;
int toBase_8(int number){ //basé sur un exemple de chiffre 14 avec base 8 -> 016
int base(8);
int entier1;
double entier2;
double decimal;
double resTemp;
int res;
resTemp = (double)number / base; //donne 1.75
entier1 = (int)resTemp; //donne 1 car transforme le double en int alors le int garde seulement l'entier
decimal = resTemp - entier1; //donne 0.75 restant
entier2 = decimal * (double)base; // donne 6
res = ((entier1*10)+(int)entier2); //donne 16
return res;
}
int toBase_2(float number){
if (number > 0 && number <= 255){ //s'sassure que le nombre est entre 0 et 255
int arr[8];
int pos(0);
while ((int)number != 0 || pos == 7){ // à chaque tour de boucle, convertie le float en entier et le compare. ajouté le ou pour etre certains de mettre des 0 jusqu'à la fin meme si la premiere condition (!=) est atteinte
number = number / 2;
if (number == (int)number){
arr[pos] = 0; //si entier
}else{
arr[pos] = 1; //si decimal
}
number = (int)number; // remet le float en int pour la prochaine division. En base 2 chaque nombre decimal doit etre redivisé en entier. Ex.: (9/2) = 4.5. Donne 1 car decimal. Apres on recommence à partir de (4/2) = 2, et non pas 4.5/2. Donne 0 car entier etc..
pos++;
}
reverse(begin(arr), end((arr))); //reverse le array avec algorithm.h car la réponse binaire ce lit sens inverse.
//mettre le array(int) en string puis en un seul int en utilisant stringstream <sstream>
stringstream ss;
for (int d(0); d<(sizeof(arr)/ sizeof(arr[0])); d++){
ss << arr[d]; //ajoute les int dans le stream
}
//METHODE 1: utiliser en string
//cout << ss.str() << endl; //sort le stream en string
//METHODE 2: utiliser en int
int myInt;
ss >> myInt; //envoie le string dans le int
//cout << myInt << endl;
return myInt;
}else{
return 0;
}
}
int main()
{
cout << setw(8) << setfill('0') << toBase_2(234) << endl;
// ex.: 14 en base 8 => 016
//cout << setw(3) << setfill('0') << toBase_8(14) << endl;
return 0;
}编辑-最终的,我从所有答案中了解到的是,事实上,我对优化的看法与您的不同。@Chnossos最能理解的是给我一些好的提示,比如演员类型的差异和放弃所有的双关,然后用Modulo (%)代替。至于其他方面,我认为这完全取决于您的优化愿景,比如尽可能使用更多的库。
谢谢你的回答。如果有其他代码优化与@Chnossos相同的想法,欢迎您。
发布于 2017-09-04 17:45:55
提供整数二进制表示的最简单(也可能是最有效)方法是使用std:bitset。
int input;
std::bitset<sizeof(int)> bits(input);
std::cout << bits.to_string() << std::endl;好了。
关于八进制(基8)表示,您可以简单地使用std::oct I/O机械手:
std::cout << std::oct << input << std::endl;正如您想了解自己的手工代码一样,下面是一些如何有效地执行该操作的提示:
float或double来做这件事。而是坚持(unsigned) int值,并在循环中使用模(%)和整数除法操作来提取数字。'0'将其转换为ASCII字符表示。>>)和二进制和运算符(&)将有助于识别单个位值,并将它们转换为'0's和'1's来表示基2值。由于您非常渴望了解自己,我将离开这里阅读上面的内容,并将这些信息放在一起,为您提供一个可行的解决方案。
如果能通过优化代码了解更多知识,看看专家们在做些什么,那就太棒了。
您可以随时检查和研究std::bitset和std::oct实现的任何免费C++编译器(GCC,Clang,.)看看真正的专家都做了些什么来实现这一点。
https://stackoverflow.com/questions/46041907
复制相似问题