请原谅我,如果在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;
}
由于我的导师告知这不是有效的逻辑,所以我应该使用按位运算符来解决同样的问题。我尝试了很多方法,但我没有完全按位逻辑。有帮助吗?提前致谢。
答案 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