制作二进制掩码以工作和隔离位和字节时,将二进制转换为十六进制的最快方法是什么?

3
假设我有以下二进制字符串:
110110010110

我只需要第4、5、6位,我们学会了使用这样的掩码

000000111000

使用二进制的&操作,我将得到我想要的位,并且我所剩下的就是将它们向右移动。

由于C语言不处理纯二进制数字,我们被告知将二进制掩码字符串转换为十六进制数是最简单的方法。我的讲师使用了一种超快速的方法将二进制字符串转换为十六进制数。

创建这些掩码的最简单和正确的方法是什么?

3个回答

7
每四个二进制位对应一个十六进制数字。学会这些规则后,只需要从右向左每四个一组进行转换即可。(如果你要转换的二进制位数不是四的倍数,则在最后一次转换之前在左侧添加零以满足条件。)
0000:0x0 0001:0x1 0010:0x2 0011:0x3 0100:0x4 0101:0x5 0110:0x6 0111:0x7 1000:0x8 1001:0x9 1010:0xA 1011:0xB 1100:0xC 1101:0xD 1110:0xE 1111:0xF

3
没错,基本上是这样的。由于16是2的幂,与十进制不同,存在直接的对应关系。 - qaphla
2
你甚至不需要“背下来”,只需要知道如何读取四位二进制数。例如:b0000 0011 1000 —> 0x038 - Stephen Canon
1
@Quaker:你甚至不需要背下来,只需每次将4位二进制转换为十六进制(1011 => 1+2+8=11=0xB)。 - Matteo Italia
1
@Quaker:当然,但这是非常基础的二进制算术,如果你对此有疑问,应该稍微复习一下这个主题。 - Matteo Italia
1
@Quaker:熟能生巧。 - Stephen Canon
显示剩余6条评论

1

对于字符串转换为字符串?取4位,找到数字(0-15),然后将其用作表查找的索引。对于掩码:

hex_digit = val & 0x0F;

将4位向下移位:
val = val >> 4;

1
在我看来,将大字符串从末尾(最低有效位)开始分成四位小块会很有帮助。例如,你的二进制数110110010110可以写成1101 1001 0110。如果你有一个不能被正确切成四位小块的数字,比如1000011010,你应该将其写成10 0001 1010
现在,它变得更简单了。在十六进制表示法中,0是0,f是15。你从零开始计数,但不再使用10个符号,而是使用16个。所以它变成了0、1、2、3、4、5、6、7、8、9、a、b、c、d、e、f。
您可以用十六进制符号替换每个比特组!在您的示例中(即1101 1001 0110),它将是d96,而在我的示例中(即10 0001 1010)它将是21a。对于二进制字符串中的每个“1”,您将2 ^ (position - 1)添加到结果中,其中position = 1表示最低有效位。例如,在0110中,您在位置2(即2 ^ (2 - 1) = 2 ^ 1 = 2)和位置3(即2 ^ (3 - 1) = 2 ^ 2 = 4)中有1,因此它是2 + 4 = 6。现在,只需在前面加上0x以告诉编译器后面是十六进制数,它就变成了0xd96
无论如何,将一个数字直接写出来意味着它是十进制表示法,前置一个 0 表示它是八进制,前置一个 0x 表示它是十六进制。
希望这能帮到你! :D

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接