假设我有以下二进制字符串:
110110010110
从中我只需要第 4 5 位和第 6 位,我们已经学会了使用这样的掩码
000000111000
因此,通过二进制&
操作,我将得到我想要的位,我剩下要做的就是将它们向右移动。
由于 C 不能处理纯二进制数,我们被告知将二进制掩码字符串转换为十六进制数是最简单的。我的讲师使用了一种超级快速的方法将二进制字符串转换为十六进制数。
创建这些面具的最简单和正确的方法是什么?
每组四位对应一个十六进制“数字”。学习这些,然后开始从右到左转换四个块。(如果您要转换的位串不是四位的倍数,则只需在左端添加零,直到最后一次转换。)
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
字符串到字符串?抓取 4 位,找到数字 (0-15),然后用作表查找的索引。对于面具:
hex_digit = val & 0x0F;
下移 4 位:
val = val >> 4;
在我看来,将大字符串从末尾(最低有效位)开始切成四位的小片段会很有帮助。例如,您的二进制数110110010110
可以写为1101 1001 0110
. 如果你有一个数字不能被正确地分成四位,比如说1000011010
,你应该把它写成10 0001 1010
。
现在,它要简单得多。在十六进制表示法中,0
是 0 和f
15。您从 0 开始计数,但现在使用 16 而不是使用 10 个符号。所以它是 0、1、2、3、4、5、6、7、8、9 ,a,b,c,d,e,f。
您可以用十六进制符号替换每组位!在您的示例(即1101 1001 0110
)中它将是d96
,而在我的示例(即10 0001 1010
)中它将是21a
。对于您在二进制字符串中找到的每一个,您都添加2 ^ (position - 1)
到您的结果中,其中position = 1
最低有效位。例如,0110
您在位置 2 (ie 2 ^ (2 - 1) = 2 ^ 1 = 2
) 和位置 3 (ie 2 ^ (3 - 1) = 2 ^ 2 = 4
) 有 1,所以它是2 + 4 = 6
。现在,只需在前面0x
告诉编译器后面是一个十六进制数字,它就变成0xd96
.
在任何情况下,按原样写一个数字意味着它是十进制表示法,前置 a0
表示它是八进制,前置 a0x
表示它是一个十六进制。
我希望这有帮助!:D