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