如何使用位 shifting/masking 将二进制转换为十六进制
How to convert binary to hex using bit shifting/masking
我试图在名为 hexConversion()
的函数中将 32 位二进制数的字符串表示形式转换为表示该数字的十六进制值的字符串形式。为此,我只需要使用基本的 C 编程(for 循环、基本数组)和位 shifting/masking。在这个赋值中,使用的二进制表示是从另一个函数 binaryConversion()
作为数组返回的。
我确实知道如何将 4 位值转换成它们的十六进制值,但我对如何将 32 位值实际分解成更小且更可行的 4 位值感到困惑。
例如,我可能想将 11111111111111111111111111111111
更改为 1111 1111 1111 1111 1111 1111 1111 1111
,这样我就可以分别使用每个 1111
将每个转换为 F
"Basic C" 但也许不是您要找的...
binaryConversion(const char *bits, char *buf, int len) {
snprintf(buf, len, "%lx", strtol(bits, NULL, 2));
}
专门使用位掩码和移位的更复杂的解决方案可能是这样的...
binaryConversion(const char *bits, char *buf, int len) {
const char *xdig = "0123456789ABCDEF";
long val = strtol(bits, NULL, 2);
int i;
for (i = 0; i < 8; ++i) {
int nib = val & 0xf;
if (len > i) buf[i] = xdig[nib];
val = val << 4;
}
}
我试图在名为 hexConversion()
的函数中将 32 位二进制数的字符串表示形式转换为表示该数字的十六进制值的字符串形式。为此,我只需要使用基本的 C 编程(for 循环、基本数组)和位 shifting/masking。在这个赋值中,使用的二进制表示是从另一个函数 binaryConversion()
作为数组返回的。
我确实知道如何将 4 位值转换成它们的十六进制值,但我对如何将 32 位值实际分解成更小且更可行的 4 位值感到困惑。
例如,我可能想将 11111111111111111111111111111111
更改为 1111 1111 1111 1111 1111 1111 1111 1111
,这样我就可以分别使用每个 1111
将每个转换为 F
"Basic C" 但也许不是您要找的...
binaryConversion(const char *bits, char *buf, int len) {
snprintf(buf, len, "%lx", strtol(bits, NULL, 2));
}
专门使用位掩码和移位的更复杂的解决方案可能是这样的...
binaryConversion(const char *bits, char *buf, int len) {
const char *xdig = "0123456789ABCDEF";
long val = strtol(bits, NULL, 2);
int i;
for (i = 0; i < 8; ++i) {
int nib = val & 0xf;
if (len > i) buf[i] = xdig[nib];
val = val << 4;
}
}