整数到基数2&;8优化 我从一开始就在阅读C++书来学习它。我已经有了编码知识,但我真的想深入学习C++,尽量从我自己的代码,而不是总是使用库。(在我学习的时候。我以后会使用图书馆。)
我目前正在阅读有关演员阵容的文章。当我阅读的时候,我试着做一些练习来应用我刚读到的东西。但这一次我失去了控制,这与我练习的内容(演员)相去甚远,但编写代码很有趣。 [编辑]我会读的谢谢@Chnossos 我在编写这段代码时学到了很多东西,比如stringsstream、reverse等 这是一个简单的int-to-base 2,我想知道是否有一种方法可以优化代码,或者它是否可以像这样正确 如果能通过优化代码了解更多信息,了解专家们在做什么,那就太好了 谢谢整数到基数2&;8优化 我从一开始就在阅读C++书来学习它。我已经有了编码知识,但我真的想深入学习C++,尽量从我自己的代码,而不是总是使用库。(在我学习的时候。我以后会使用图书馆。),c++,optimization,C++,Optimization,我目前正在阅读有关演员阵容的文章。当我阅读的时候,我试着做一些练习来应用我刚读到的东西。但这一次我失去了控制,这与我练习的内容(演员)相去甚远,但编写代码很有趣。 [编辑]我会读的谢谢@Chnossos 我在编写这段代码时学到了很多东西,比如stringsstream、reverse等 这是一个简单的int-to-base 2,我想知道是否有一种方法可以优化代码,或者它是否可以像这样正确 如果能通过优化代码了解更多信息,了解专家们在做什么,那就太好了 谢谢 #include <iostre
#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;
}
#包括
#包括
#包括
使用名称空间std;
int toBase_8(int编号){//basésur un chiffre 14 avec base 8->016
int-base(8);
国际实体1;
双实体2;
双十进制;
双重休息;
国际关系;
resTemp=(双精度)number/base;//donne 1.75
entier1=(int)resTemp;//donne 1 car transform le double en int alors le int garde seulen l'entier
decimal=resTemp-entier1;//donne 0.75 restant
entier2=十进制*(双精度)基数;//donne 6
res=((entier1*10)+(int)entier2);//donne 16
返回res;
}
int toBase_2(浮点数){
如果(number>0&&number提供整数二进制表示的最简单(可能也是最有效)方法是使用:
正如您想了解自己的手工编写的代码一样,以下是一些如何高效地完成这项工作的提示:
- 不要使用
float
或double
来完成此操作。而是坚持(无符号
)int
值,并在循环中使用模(%
)和整数除法运算来提取数字
- 如果已提取所选基的数字,则可以通过添加
'0'
将其转换为ASCII字符表示形式
- 位移位运算符(
>
)和二进制and运算符(&
)有助于识别单个位值,并将其转换为表示基2值的'0'
和'1'
)
由于您非常渴望了解自己,我将离开这里阅读上述内容,并将这些信息整合到一个有效的解决方案中
如果能通过优化代码了解更多信息,了解专家们在做什么,那就太好了
<>你可以随时检查和研究<代码> STD::BITSET/<代码>和 STD::OCT任何自由C++编译器(GCC,Clang,…)的实现,看看真正的专家们做了什么来实现这个。 最简单(也可能最有效)提供整数二进制表示的方法是使用:
正如您想了解自己的手工编写的代码一样,以下是一些如何高效地完成这项工作的提示:
- 不要使用
float
或double
来完成此操作。而是坚持(无符号
)int
值,并在循环中使用模(%
)和整数除法运算来提取数字
- 如果已提取所选基的数字,则可以通过添加
'0'
将其转换为ASCII字符表示形式
- 位移位运算符(
>
)和二进制and运算符(&
)有助于识别单个位值,并将其转换为表示基2值的'0'
和'1'
)
由于您非常渴望了解自己,我将离开这里阅读上述内容,并将这些信息整合到一个有效的解决方案中
如果能通过优化代码了解更多信息,了解专家们在做什么,那就太好了
<>你可以随时检查和研究<代码> STD::BITSET/<代码>和 STD::OCT任何自由C++编译器(GCC,Clang,…)的实现,看看真正的专家们是如何实现的。你为什么要“深入学习C++”?我没有看到一个单独的C++模型。例如,表达式>(int)RESeMP;< /C> >被称为C样式的Casts,不应该在C++中使用。@ CHNSOSOS,C++风格如何帮助铸造数值类型?@ CHINSOSOS,如果我有一个浮点,那么我使用(int)浮点,那么这是一个抛出的“否”?看起来你完全误解了不同的基础意味着什么。如果你“转换”6到110,你就没有六的基数2,你有一百一十。为什么你要“深入学习C++”,我看不到其中的一个C++ C++……表达式,比如<代码>(int)。RESEMMP; 被称为C风格的Casts,不应该在C++中使用。@ CHNSOSOS,C++风格如何帮助帮助铸造数字类型?@ CHINSOSOS如果我有一个浮点,然后我使用(int)浮点,那么这是一个强制转换的否定形式吗?看起来你完全误解了不同的基础是什么意思。如果你“转换”了。6到110,在基数2中没有6个,只有110个。这不能回答,如果它能像这样正确的话。
操作问题的一部分。使用模板和库不会让我了解事情是如何工作的。@Chnossos我让你来回答这个部分。@MindKind是的,会的。如果你想要详细信息,你可以随时查看一个实现的源代码。如果你想学习C++,你还必须学习如何使用标准的LIB提供的内容。you@MindKind如前所述,研究这些标准库的实现。这将促进(双关语)你的知识。顺便说一句,没有必要生气。这并不能回答,如果它能像这样正确。
是OP问题的一部分。使用模板和库不会让我了解事情是如何工作的。@Chnossos我让你回答这部分。@MindKind是的。如果你
int input;
std::bitset<sizeof(int)> bits(input);
std::cout << bits.to_string() << std::endl;
std::cout << std::oct << input << std::endl;