在没有格式说明符的情况下,将二进制int数转换为C中的十六进制数



在我的程序中,有一点我想将二进制数转换为十六进制数,但我遇到了很多问题。我正在将这个数字转换为十六进制数字,而不使用任何格式说明符,对实际转换进行编码。

我从Khan Academy教程等视频中研究了如何手动做到这一点:https://www.khanacademy.org/math/pre-algebra/applying-math-reasoning-topic/alternate-number-bases/v/binary-to-hexadecimal

我理解数学意义上的转换,但把它翻译成代码让我很困惑

到目前为止,我所拥有的是函数调用。我已经有一个integer类型的二进制。我需要将其发送到一个函数中,该函数将返回其十六进制等效值。由于十六进制值可以用a-f、a-f字符表示,因此我认为从函数返回整数是无效的。因此,函数必须返回一个包含转换后的十六进制值的char指针或char数组。以下是我的函数调用计划:

char * hexAnswer;
hexAnswer = binaryToHex(answer) //answer is the binary number of type int

我遇到的问题是二进制到十六进制转换的函数代码本身。现在,我对转换的思考过程如下:

第一步:将整数分成4组。步骤2:转换二进制段4与其十六进制等价物:

char * binaryToHex(int n)
{
   //break into groups of 4
   //send group of 4 to switch statement of equivalent hexadecimal conversion
   //append the converted groups together
    //Return hex number
}

这是switch语句:

char * IndividualBinToHex (/*The group of 4 binary digits*/) {
switch (/*group of 4 binary digits*/) {
    case '0000':
        return "0";
        break;
    case '0001':
        return "1";
        break;
    case '00010':
        return "2";
        break;
    case '0011':
        return "3";
        break;
    case '0100':
        return "4";
        break;
    case '0101':
        return "5";
        break;
    case '0110':
        return "6";
        break;
    case '0111':
        return "7";
        break;
    case '1000':
        return "8";
        break;
    case '1001':
        return "9";
        break;
    case '1010':
        return "A";
        break;
    case '1010':
        return "a";
        break;
    case '1011':
         return "B";
         break;
    case '1100':
        return "C";
        break;
    case '1101':
        return "D";
        break;
    case '1110':
        return "E";
        break;
    case '1111':
        return "F";
        break;
     }
   }

我仍然有点困惑于函数体将具体包含什么。谢谢你给我的任何帮助。

以下是基本思想:

int raw_input;      // int to convert
// convert to unsigned to have defined shifting operations
unsigned int input=(unsigned int) raw_input;
static const char xlate[] = "0123456789ABCDEF";
static const int digits=2*sizeof (unsigned int);
char answer[3+digits];
answer [0]="0";
answer [1]="x";
int shift=4*digits;
for (int i = 0; i < digits; ++i)
{
   shift-=4;
   int nibble=(input >> shift) & 0xF;
   answer [2+i]=xlate [nibble];
}
answer [2+digits]='';

只需移动半字节并屏蔽它,然后使用查找表将其转换为字符。

此解决方案取自Martin James的(在注释中(。他的解决方案远远优于最初的答案。

#include <stdio.h> 
const char* hexlat="0123456789ABCDEF";
char * binaryToHex(unsigned int answer, char * result)
{ 
    if( answer == 0 ) return result; 
    else 
    { 
        // shift next nibble bits into rightmost nibble and recurse
        result=binaryToHex( answer>>4, result );
        // AND with last 4 bits, and get hex char to assign to current char
        *result = hexlat[answer & 0x0F];
        // return current char pointer + 1 to parent call
        return result+1; 
    } 
};
int main(void) 
{ 
    unsigned int answer = 0x12340ADF;
    char hexAnswer[ 32 ];
    // note the '' null terminates the end of the string
    // since binaryToHex recursively returns the char index + 1
    *binaryToHex( answer, hexAnswer ) = '';
    printf( "%s", hexAnswer );
    return 0; 
}

最新更新