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

int x = 0xFF;
int y = 255;

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

编辑 :*编译从执行更改。 我假设到二进制的转换是在执行时,但考虑到@muntoo的回答,似乎是在编译时

===============>>#1 票数: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条指令。 在十六进制的情况下,每个字符可能会有更多的指令,但是十进制数会包含更多的字符,因此很难告诉先验哪个应该更快。 这种情况仅发生在您有能力键入代码的整数的总数上,例如大约100。如果机器每秒可以执行10 ^ 8条指令,则它可以以大约5%的速率读取数字。每秒10 ^ 7,或者每个字符大约100纳秒,或者文件中所有数字的10微秒,大约等于或等于一个数量级。

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

===============>>#2 票数: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()更快。 AFaf的概率大于0-9 。)


但是,从转换FF为二进制数可以比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));
}

虽然你没有得到十进制没有bitshifts二进制,但你没有得到任何AF也没有af也没有。

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);    
}

结论:仍然取决于编译器,但是255 可能编译起来更快。 :)

  ask by Nick Rolando translate from so

未解决问题?本站智能推荐:

2回复

十进制,二进制,八进制,十六进制转换中的错误

我有一个正在处理的代码,我想为bin,八进制,十六进制和十进制构建一个转换器。 我有一个框架,其中有一个文本空间,您可以在其中输入任何一个选项。 根据输入内容的不同,程序会将其转换为其他形式。 我的问题是,它可以将小数转换为其他形式,反之亦然吗? 我很困惑,因为我认为逻辑流程就在那里,对
2回复

C中的十进制和十六进制二进制

我想创建将返回十六进制数字的函数。 但是在更改为十进制数字后,我得到了一些错误的数字。 在输出中,第一个数字是二进制,第二个也是二进制但采用int格式,第三个数字应为十进制。 但是我用十进制表示的数字有误(请参阅第二行,应该是156,而不是220)。 谁能解释我在做什么错,我怎么能得到正
1回复

尝试将C ++二进制数组转换为十六进制,然后打印结果

我想打印一个8字节的int数组,并将其转换为bin&hex,输出如下: 我已经完成了二进制转换函数的创建。 我想使用与二进制转换相同的功能-使用数组,但是将左半部分与右半部分进行检查,并求解8个字节的每个不同侧面; 最左-3,最右是-7。 我究竟做错了什么? 我无法弄清楚如何实现
3回复

以二进制模式扫描文件并将十六进制字符解释为C ++中的实际数字

我知道这个标题可能听起来令人困惑。 我有一个简单的问题,但我还没有解决。 让我们想象一下我有一个文件,用十六进制编辑器打开它显示它里面有两个字符,比如说0x1B和0x00 (显然是不可打印的)。 我希望把这个当作是1B00 十六进制 ,这是在6912 DEC,而不是直接转换这将是错误的
3回复

将二进制转换成十六进制再转换成十进制

我的二进制数是10101011。我知道这是十六进制的AB,我知道十进制的A = 10和B = 11。 但是,如何从十进制的10和11到最终的171? 用十六进制我会做 我可以对小数点做类似的事情,从10和11到171吗? 基本上,我只是在寻找一种无需计算器即可转换任何二进制数的
1回复

有关从二进制转换为十六进制的问题? 从十六进制到十进制

有关作业的问题: 如何将-20(十进制)表示为定点符号,8位,2的补码? 回答: EC(16 --->十六进制。 题: 我了解如何获得答案。 我将以10为底的-20转换为2的补数,得到11101100。十六进制为1110 = E,十六进制为1100 = C。
3回复

关于将十进制转换为二进制再转换为十六进制的问题

我在这里有些困惑: 我正在尝试对ASCII值65进行反向工程。在我读的书中,它说: 但是二进制形式的65是: 十六进制的0010为2,而0001为1,表示十六进制值“应该”为:21。 我哪里做错了?
3回复

在方案中将包含二进制数的列表转换为十进制和十六进制

我很擅长计划。 我知道如何从十进制转换为二进制,但我不能带来转换相反的逻辑。 我想从二进制数列表中得到一个十进制数。 十进制示例: 十六进制示例: 到目前为止,我认为可以使用列表的最后一个数字并将其递归乘以2 i ,其中i表示列表中的位置,因此最后一个数字乘以1,下一个
1回复

解码RFID数据十六进制数学问题C ++

目前,我一直无法从RFID卡获取所需的结果数据。 我已将其解码,但现在我需要做一些其他事情,才能从卡背面获得最终的卡号。 隐含值为E ******** B 0 E。 解密后变成0000003048D1263B 。 现在,我还需要执行3个步骤才能获得所需的卡号。 步骤1)
2回复

难以理解给定十六进制格式的二进制补码转换成十进制格式的练习

我正在尝试将以下十六进制值的二进制补码转换为十进制值: 23、57、94和87。 a)23 步骤:(3 x 16 ^ 0)+(2 x 16 ^ 1)->(3)+(32)= 35(正确) b)57 步骤:(7 x 16 ^ 0)+(5 x 16 ^ 1)->