【问题标题】:converting decimal to hex using bitmask and shift in C使用位掩码将十进制转换为十六进制并在 C 中移位
【发布时间】:2013-10-28 16:21:50
【问题描述】:

我的代码中出现分段错误时遇到了麻烦。我正在尝试制作一个将十进制数转换为十六进制数的函数。 另外,如果我要使用:15&15,数字是 1111 还是 15?

这是我的代码:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

char *to_hex(int n);

main(){
    int dec;
    printf("-> ");
    scanf("%d",dec);
    printf(to_hex(dec));
}

char *to_hex(int n){
    char *array = malloc(sizeof(int)*2+8);/*makes array*/
    int i;
    int index=0;/*used for storing into array*/
    for(i=28;i>-1;i=i-4){/*mask and compare 8 times*/
        int shift=n>>i;/*right shift*/
        int mask=shift&15;/*masks*/
        if (mask<10){
            *(array+index)=(char)mask;
            index++;
        }
        else{
            switch(mask){
            case 10:
                *(array+index)='a';
                index++;
                break;
            case 11:
                *(array+index)='b';
                index++;
                break;
            case 12:
                *(array+index)='c';
                index++;
                break;
            case 13:
                *(array+index)='d';
                index++;
                break;
            case 14:
                *(array+index)='e';
                index++;
                break;
            case 15:
                *(array+index)='f';
                index++;
                break;
            }
        }
    }
    *(array+index)='\0';
    return array;
}

我认为 : int mask : 会等于 15 而不是 1111 我正确吗?谢谢

【问题讨论】:

  • *(array+index)='a'; index++; 相当 array[index++] = 'a';(使用空格和 C 习语...)
  • 15&amp;15 would the number be 1111 or 15? - 二进制 1111,十进制 15...我不明白您对所有这些转换的问题是什么。此外,如果mask 小于 10,则字符错误。代码为 0 的字符不是字符 '0'。为此,您需要mask + '0'
  • 您可以将printf(to_hex(dec)); 替换为printf("%x",dec);
  • 我刚开始学习 C 语言,所以我不太清楚 c 习语是什么意思,但我正在尝试学习指针而不是使用“array[]”。我对分段错误的位置有点困惑。我也忘了在 else 语句之后输入代码 n=n
  • 我不确定你所说的代码 0 是什么意思。你的意思是当我将整数转换为字符时?

标签: c hex decimal shift bitmask


【解决方案1】:

您可以通过将scanf("%d",dec); 更改为scanf("%d",&amp;dec); 来避免段错误,如果您想要可打印的结果,请将*(array+index)=(char)mask; 更改为*(array+index)=(char)mask+'0';(或者,更好的是array[index] = mask + '0';

printf(to_hex(dec)); 也有点不确定。请改用printf("%s",to_hex(dec));;更安全。

【讨论】:

  • 哇,非常感谢。我希望我可以对此表示赞同,但我没有足够的代表。再次感谢您^^
  • 没有问题。玩得开心编程——不久之后一切都会变得有意义。如果您负担得起,请获取这本书的副本:amazon.com/C-Programming-Language-2nd-Edition/dp/0131103628
猜你喜欢
  • 2017-03-08
  • 2021-12-10
  • 1970-01-01
  • 2016-07-17
  • 2011-09-21
  • 1970-01-01
  • 2017-07-31
  • 2013-07-20
  • 2012-06-17
相关资源
最近更新 更多