【问题标题】:C - display int as hex using bitwise operatorsC - 使用按位运算符将 int 显示为十六进制
【发布时间】:2012-08-03 04:52:06
【问题描述】:

我正在阅读关于 displaying integers as hex using C 的 SO 问题(不使用 %x,通过使用自定义函数),第一个答案提到使用按位运算符来实现目标。

但我自己无法弄清楚。谁能告诉我这是怎么做的?

【问题讨论】:

  • 该答案为您提供了可以使用的“食谱”。你为什么不试一试,如果它不起作用,发布你尝试过的代码,以便人们可以帮助你修复它?
  • 基本循环:for ( ; n; n /= 16) { prepend(alphabet[n % 16]); }。无需摆弄。

标签: c hex bit-manipulation


【解决方案1】:

我希望这能让你明白一点。

char *intToHex(unsigned input)
{
    char *output = malloc(sizeof(unsigned) * 2 + 3);
    strcpy(output, "0x00000000");

    static char HEX_ARRAY[] = "0123456789ABCDEF";
    //Initialization of 'converted' object

    // represents the end of the string.
    int index = 9;

    while (input > 0 ) 
    {
        output[index--] = HEX_ARRAY[(input & 0xF)];
        //Prepend (HEX_ARRAY[n & 0xF]) char to converted;
        input >>= 4;            
    }

    return output;
}

【讨论】:

    【解决方案2】:

    不是“最佳解决方案”。同一线程中的其他发帖人建议使用表格查找,这要好得多。

    但是,为了回答你的问题,这几乎就是他的建议:

    Convert integer to hex

    整数的每 4 位恰好映射到一个十六进制数字,如果值 这四个位小于 10,那么它的 ASCII 表示是 '0' + value,否则为'A' + value - 10。

    您可以通过移位和屏蔽提取每组四位数字。这 掩码值为 0x0f,假设为 32 位整数,右移 从 24 位开始,每个连续数字减 4。

    #include <stdio.h>
    
    unsigned int
    hex_digit (int ival, int ishift)
    {
      ival = (ival >> ishift) & 0xf;
      if (ival < 10)
        ival += '0';
      else
        ival += ('a' + ival - 10);
      return ival;
    }
    
    int
    main()
    {
      int i = 100;
      char s[9];
    
      s[0] = hex_digit (i, 28);
      s[1] = hex_digit (i, 24);
      s[2] = hex_digit (i, 20);
      s[3] = hex_digit (i, 16);
      s[4] = hex_digit (i, 12);
      s[5] = hex_digit (i, 8);
      s[6] = hex_digit (i, 4);
      s[7] = hex_digit (i, 0);
      s[8] = '\0';
    
      printf ("hex(%d)=%s\n", i, s);
      return 0;
    }
    

    样本输出:

    gcc -o tmp -g -Wall -pedantic tmp.c
    ./tmp
    hex(100)=00000064
    

    【讨论】:

      猜你喜欢
      • 2023-02-21
      • 1970-01-01
      • 2016-06-28
      • 1970-01-01
      • 1970-01-01
      • 2015-03-30
      • 1970-01-01
      • 2019-08-04
      • 2012-06-21
      相关资源
      最近更新 更多