假设我有以下二进制字符串:
110110010110
我只需要第4位和第6位,我们学会了使用这样的面具
000000111000
因此,使用二进制&
操作,我将得到我想要的位,而我剩下要做的就是将它们移到右边。
由于C不能使用普通的二进制数,我们被告知最简单的方法是将二进制掩码字符串转换为十六进制数。我的讲师使用超快速方法将二进制字符串转换为十六进制数字。
创建这些面具的最简单,最正确的方法是什么?
答案 0 :(得分:7)
每组四位对应一个十六进制“数字”。学习那些,然后开始从右到左转换四个块。 (如果您要转换的位数不是四位的倍数,那么只需在左端添加零,直到它进行最后一次转换。)
<00> 0000:0x0答案 1 :(得分:1)
对于字符串到字符串?抓取4位,找到数字(0-15),然后用作表查找的索引。对于面具:
hex_digit = val & 0x0F;
使用以下位移4位
val = val >> 4;
答案 2 :(得分:1)
在我看来,从最后(最低位)开始将大字符串切成4位的小块是有帮助的。例如,您的二进制数110110010110
可以写为1101 1001 0110
。如果您的号码无法正确地分成四位,例如1000011010
,则应将其写为10 0001 1010
。
现在,它更加简单。在十六进制表示法中,0
为0,f
为15.您从零开始计数,但现在使用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(即2 ^ (2 - 1) = 2 ^ 1 = 2
)和位置3(即2 ^ (3 - 1) = 2 ^ 2 = 4
)中有1,因此它是2 + 4 = 6
。现在,只需预先设置0x
告诉编译器后面的内容是十六进制数,它变为0xd96
。
在任何情况下,写一个数字都意味着它是十进制表示法,前面加0
表示它是八进制,前面加0x
表明它是十六进制。
我希望这有帮助! :d