Int到Base 2和8优化

Min*_*ind 1 c++ optimization

我正在阅读一本C++书籍,从一开始就学习它.我已经拥有编码知识但我真的想通过尽可能多地从我自己编写代码而不是总是使用库来深入学习C++.(虽然我正在学习.我稍后会使用库.)

我现在正在阅读有关演员阵容的文章.在我读书的时候,我尝试用练习来应用我刚才读到的内容.但是这次我失去了控制,它远离我正在练习的东西(演员),但编码很有趣.[编辑]我将阅读不同的演员阵容. - 谢谢@Chnossos

我在编写诸如stringsstream,reverse等代码时学到了很多东西.

这是一个基于2的简单int,我想知道是否有一种优化代码的方法,或者它是否像这样正确.

通过优化的代码了解更多信息可以很好地了解专家们正在做什么.

谢谢.

#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;
}
Run Code Online (Sandbox Code Playgroud)

[编辑 - 最后]我从所有答案中理解的是,我的优化愿景与您的不同.@Chnossos最了解我的好处,如演员类型差异和丢弃所有Double并使用Modulo(%)代替.对于其他人,我认为这完全取决于您的优化愿景,例如尽可能多地使用库.

谢谢你的回答.如果有人在与@Chnossos相同的情况下进行其他代码优化,那么欢迎您.

use*_*042 5

提供整数的二进制表示的最简单(也可能是最有效)方法是使用std:bitset:

int input;
std::bitset<sizeof(int)> bits(input);
std::cout << bits.to_string() << std::endl;
Run Code Online (Sandbox Code Playgroud)

完成.


关于八进制(基数8)表示,您可以简单地使用std::octI/O操纵器:

std::cout << std::oct << input << std::endl;
Run Code Online (Sandbox Code Playgroud)

如您想了解自己的手动代码,这里有一些提示如何有效地执行此操作:

  • 不要使用floatdouble那样做.而是坚持(unsigned)int值并%在循环中使用modulo()和整数除法运算来提取数字.
  • 如果您为所选基数提取了数字,则可以通过添加将它们转换为ASCII字符表示形式'0'.
  • 位移运算符(>>)和二进制运算符(&)用于识别单个位值,并将它们转换为'0's和'1's以表示基数2的值.

由于您非常渴望自学,我将继续阅读上述内容并将这些信息整合到一个可行的解决方案中.


通过优化的代码了解更多信息可以很好地了解专家们正在做什么.

您可以随时检查和研究任何免费C++编译器(GCC,Clang,...)的实现std::bitsetstd::oct实现,以了解真正的专家为实现它所做的工作.

  • @MindKind是的,它会.如果您需要详细信息,可以随时查看实现的来源.如果你想学习c ++,你还必须学习如何使用标准的lib为你提供的东西 (2认同)