Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
整数到基数2&;8优化 我从一开始就在阅读C++书来学习它。我已经有了编码知识,但我真的想深入学习C++,尽量从我自己的代码,而不是总是使用库。(在我学习的时候。我以后会使用图书馆。)_C++_Optimization - Fatal编程技术网

整数到基数2&;8优化 我从一开始就在阅读C++书来学习它。我已经有了编码知识,但我真的想深入学习C++,尽量从我自己的代码,而不是总是使用库。(在我学习的时候。我以后会使用图书馆。)

整数到基数2&;8优化 我从一开始就在阅读C++书来学习它。我已经有了编码知识,但我真的想深入学习C++,尽量从我自己的代码,而不是总是使用库。(在我学习的时候。我以后会使用图书馆。),c++,optimization,C++,Optimization,我目前正在阅读有关演员阵容的文章。当我阅读的时候,我试着做一些练习来应用我刚读到的东西。但这一次我失去了控制,这与我练习的内容(演员)相去甚远,但编写代码很有趣。 [编辑]我会读的谢谢@Chnossos 我在编写这段代码时学到了很多东西,比如stringsstream、reverse等 这是一个简单的int-to-base 2,我想知道是否有一种方法可以优化代码,或者它是否可以像这样正确 如果能通过优化代码了解更多信息,了解专家们在做什么,那就太好了 谢谢 #include <iostre

我目前正在阅读有关演员阵容的文章。当我阅读的时候,我试着做一些练习来应用我刚读到的东西。但这一次我失去了控制,这与我练习的内容(演员)相去甚远,但编写代码很有趣。 [编辑]我会读的谢谢@Chnossos

我在编写这段代码时学到了很多东西,比如stringsstream、reverse等

这是一个简单的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;
}
#包括
#包括
#包括
使用名称空间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;