仅使用C中的按位运算符将十六进制输入转换为十进制numbur?

时间:2018-01-15 04:58:33

标签: c bit-manipulation bitwise-operators

请原谅我,如果在SO上反复提问,但我对其他答案不满意所以我再问一次。我的任务是使用按位运算符将给定的十六进制(字符串格式)数字转换为等效的十进制数字,我不应该使用预定义的任何函数。这是我尝试使用普通逻辑的代码。

#include<stdio.h>
#include<string.h>
int main()
{
        int i,n=0,k=1,j;
        char a[50],b[50],c;
        printf("Enter hex number\n");
        fgets(a,sizeof(a),stdin);

        for(j=0;a[j];j++);
        int len =j;

        for(i=0,j=j-1;j>i;i++,j--)
        {
                c=a[i];
                a[i]=a[j];
                a[j]=c;
        }
        for(i=0;a[i];i++)
        {
                if(a[i]>='0' && a[i]<='9')
                        b[i]=a[i]-48;
                else if(a[i]>='a' && a[i]<='f')
                        b[i]=a[i]-87;
                else if(a[i]>='A' && a[i]<='F')
                        b[i]=a[i]-55;
                else
                {
                        printf("Wrong input\n");
                        return;
                }
        }
        b[i]='\0';
        for(i=0;i<l;i++)// HERE DON'T USE b[i] COZ FOR 0 48-48=0='\0' SO IT WILL FAIL
        {
                if(i==0)
                        n=n+b[i];
                else
                        n=n+(b[i]*(k=k*16));
        }
        printf("Decimal is %d\n",n);

        return 0;
}

由于我的导师告知这不是有效的逻辑,所以我应该使用按位运算符来解决同样的问题。我尝试了很多方法,但我没有完全按位逻辑。有帮助吗?提前致谢。

3 个答案:

答案 0 :(得分:2)

仅解决字符串到数字部分,如何查找简单的表,并避免使用<>等所有算术关系运算符?

unsigned hexadecimal(char * hexadecimal_input) {
  // Form the table
  static unsigned char val[UCHAR_MAX + 1] = { //
      ['0'] = 0, ['1'] = 1,  ['2'] = 2,  ['3'] = 3,  ['4'] = 4, //
      ['5'] = 5, ['6'] = 6,  ['7'] = 7,  ['8'] = 8,  ['9'] = 9, //
      ['A'] = 10,['B'] = 11, ['C'] = 12, ['D'] = 13, ['E'] = 14,  ['F'] = 15, //
      ['a'] = 10,['b'] = 11, ['c'] = 12, ['d'] = 13, ['e'] = 14,  ['f'] = 15,};

  unsigned sum = 0;
  // Keep looping until \0 encountered 
  while (*hexadecimal_input) {
    unsigned digit = val[(unsigned char) *hexadecimal_input];  // Loop up the value
    if (digit == 0 && *hexadecimal_input != '0') {
      printf("Wrong input\n");
      return -1u;
    }
    sum <<= 4;     // Shift the sum 4 bits left to make room for the new hex digit
    sum |= digit;  // Or in the next digit

    // Using &...[1] to hide ++ increment, which is a non-bit-wise operator
    // Of course [] might be considered an invalid operator too.  
    hexadecimal_input = &hexadecimal_input[1];  
  }
  return sum;
}

只要UCHAR_MAX == 255

,这是一种合理的方法

答案 1 :(得分:0)

一个小提示可以帮助我思考,完全逻辑使用bitwise可能是不可能的。

首先获取Decimal相当于hexa input,然后根据输入字符串反转整个字符串,然后执行minus 48/87 or 55

你可以执行相同的任务而不像你那样执行字符串的反转,部分

 if(a[i]>='0' && a[i]<='9')
      b[i]=a[i]-48;

替换为

int sum = 0, j = strlen(a);
... for loop ...
if(a[i]>='0' && a[i]<='9')
      sum += (a[i]-48)*(1<<4*(j-i-1));

最后sum包含十进制否,同样适用于lowercase&amp; upper case常数也是。

for(i=0;a[i];i++)
{
    if(a[i]>='0' && a[i]<='9')
         sum+=(a[i]-48)*(1<<4*(j-i-1));
    else if(a[i]>='a' && a[i]<='f') {
         sum+=(a[i]-87)*(1<<4*(j-i-1));
    else if(a[i]>='A' && a[i]<='F')
         sum+=(a[i]-55)*(1<<4*(j-i-1));
} 

我认为可以帮到你。

答案 2 :(得分:0)

转换'0' - '9'和'A'/'a' - 'F'/'f'的一些按位操作

tune