首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Int到Base 2&8优化

Int到Base 2&8优化
EN

Stack Overflow用户
提问于 2017-09-04 17:38:18
回答 1查看 155关注 0票数 1

我现在正在读一本C++的书,从一开始就学习它。我已经掌握了编码知识,但我真的很想通过尽可能多地从自己的代码中编写代码来深入学习C++,而不是总是使用库。)当我在学习的时候。我稍后会使用图书馆。)

我目前正在读有关模特儿的文章。当我阅读的时候,我试着做一些练习来应用我刚读到的东西。但是,这一次我失去了控制,它远离了我正在练习的东西(转换),但是代码很有趣。编辑我将阅读Different casts。-谢谢@Chnossos

在编写这些代码的过程中,我学到了很多东西,比如字符串流、反向等。

这是一个简单的int to base 2,我想知道是否有优化代码的方法,或者它是否可以像这样正确。

如果能通过优化代码了解更多知识,看看专家们在做些什么,那就太棒了。

谢谢。

代码语言:javascript
复制
#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相同的想法,欢迎您。

EN

回答 1

Stack Overflow用户

发布于 2017-09-04 17:45:55

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

代码语言:javascript
复制
int input;
std::bitset<sizeof(int)> bits(input);
std::cout << bits.to_string() << std::endl;

好了。

关于八进制(基8)表示,您可以简单地使用std::oct I/O机械手:

代码语言:javascript
复制
std::cout << std::oct << input << std::endl;

正如您想了解自己的手工代码一样,下面是一些如何有效地执行该操作的提示:

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

由于您非常渴望了解自己,我将离开这里阅读上面的内容,并将这些信息放在一起,为您提供一个可行的解决方案。

如果能通过优化代码了解更多知识,看看专家们在做些什么,那就太棒了。

您可以随时检查和研究std::bitsetstd::oct实现的任何免费C++编译器(GCC,Clang,.)看看真正的专家都做了些什么来实现这一点。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46041907

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档