二进制转换时的十六进制与十进制

时间:2011-07-23 01:01:11

标签: c++ binary decimal hex

例如,以下是两种设置整数变量的方法(比如C ++):

int x = 0xFF;
int y = 255;

哪个语句编译可以更快地将实际位设置为整数值?

已编辑:*编译已从执行更改。我假设转换为二进制是在执行时,但似乎在编译时给定@ muntoo的答案

2 个答案:

答案 0 :(得分:8)

执行时间完全没有区别,编译速度可能没有差别。

添加以回复评论:
这是发生了什么。编译器有一个解析器,可能是递归下降的,在底部调用一个词法分析器来获取令牌。在这种情况下,=之后的标记是一个数字,它可以通过前导数字来表示,所以它就是这样的,其中pc是指向当前字符的指针:

if (isdigit(*pc)){
  intpart = 0;
  if (pc[0]=='0' && pc[1]=='x'){
    pc += 2;
    while(ishexdigit(*pc)){
      intpart *= 16;
      if (isdigit(*pc)){
        intpart += (*pc - '0')
      }
      else {
        intpart += (tolower(*pc) - 'a' + 10);
      }
      pc++;
    }
  }
  else {
    while(isdigit(*pc)){
      intpart *= 10;
      intpart += (*pc - '0');
      pc++;
    }
    if (*pc == '.'){
      // ... handle fractional part
    }
  }
}

无论如何,正如您所看到的,这是一个非常紧凑的循环,对于数字中的每个字符,isdigitishexdigittolower执行一次或两次,乘法,减法和加成。假设这些函数是在线的,我们说每个字符可能有10-20条指令。 在十六进制情况下,每个字符可能稍微多一些指令,但十进制数字会有更多的字符,所以很难说 a-priori 哪个应该更快。 这只发生在您有能力在代码中输入的此类整数的总数,例如大约100。 如果机器每秒可以执行10 ^ 8条指令,它可以以大约10 ^ 7每秒的速率读取数字,或者每个字符大约100纳秒,或者对于文件中的所有数字都是10微秒,给出或需要一个数量级。

一旦编译器知道它是一个数字,它就会成为抽象语法树的一部分,它用于生成汇编语言。到那时,它是十六进制或十进制的事实早已被遗忘。它只知道它是某个值的二进制整数,所以汇编语言是相同的。

答案 1 :(得分:3)

从编译器的角度来看,

0xFF255相同。两者都将生成完全相同的代码。您的编译器将它们“转换”为11111111b


编译速度全部取决于编译器及其编译方式。

例如,0xFF可以被识别为十六进制数字(忽略正则表达式,这将是首选方法):

bool myishex(string sz)
{
    if(sz[0] == '0' && sz[1] == 'x')
    {
        for(size_t i = 2; i < sz.length(); ++i)
            if(!(sz[i] >= '0' && sz[i] <= '9') || !(sz[i] >= 'A' && sz[i] <= 'F') || !(sz[i] >= 'a' && sz[i] <= 'f'))
                return(false);
    }
    else
    {
        return(false);
    }

    return(true);
}

myisnum()相比:

bool myisnum(string sz)
{
    for(size_t i = 0; i < sz.length(); ++i)
        if(!(sz[i] >= '0' && sz[i] <= '9'))
            return(false);

    return(true);
}

嗯,myisnum() 通常myishex()快。 (A-Fa-f的概率高于0-9。)


但是从FF到二进制数的转换可能比<{1}} 更快

255

虽然你没有得到十进制到二进制的位移,但你也没有得到int myhex2bin(string sz) { int b = 0; sz = sz.substr(2); // Cut the "0x" out. for(size_t i = 0; i < sz.length(); ++i) { sz[i] = tolower(sz[i]); b += myhexdigit2dec(sz[i]) << ((sz.length() - (i + 1)) << 2); } return(b); } // Unsafe. Optimized for speed. int myhexdigit2dec(char c) { return(c < 'A' ? c - '0' : (c < 'a' ? c - 'A' + 10 : c - 'a' + 10)); } A-F

a-f

结论:仍取决于编译器,但int mydec2bin(string sz) { int b = 0; int factor = 1; for(size_t i = sz.length(); i > 0; --i) { b += (sz[i - 1] - '0') * factor; factor *= 10; } return(b); } 可能编译速度更快。 :)