由于我的一位同事正在休假,所以我对C的知识不多,并且一直困扰着我。
我有一个32位数字,我必须从中提取位。我确实经历了几个线程,但是我仍然不清楚如何做到这一点。如果有人可以帮助我,我将非常有义务。
这是我需要做的一个例子:
假设十六进制数= 0xD7448EAB。在二进制= 1101 01 11 0100 0100 1000 11 10 1010 1011中,我需要提取16位并输出该值。我想要10到25位。
低10位(十进制)将被忽略。即10 1010 1011被忽略。
高6位(溢出)将被忽略。即1101 01被忽略。
剩下的16位数据需要作为输出11 0100 0100 1000(需要用斜体数字作为输出)。
这是一个例子,但是我将一直保持不同的十六进制数,我需要提取与我解释相同的位。
我该如何解决?
谢谢你。
对于此示例,您将输出1101 0001 0010 0011,即0xD123或十进制53,539。
您需要使用遮罩才能获得所需的位。掩码是数字,您可以使用其以所需的方式在位中进行筛选(保留位,删除/清除位,修改数字等)。您需要知道的是AND,OR,XOR,NOT和移位操作。对于您所需要的,您只需要几个。
您知道移位: x << y
将位从x * y位置向左*移动。
如何按顺序将x位设置为1: (1 << x) - 1
如何从y到y + x依次获取设置为1的x位: ((1 << x) -1) << y
上面是您需要的位的掩码。因此,例如,如果您想要16位0xD7448EAB,从10到25,则需要上面的x = 16和y = 10。
而现在得到你想要的位,只是和您的电话号码0xD7448EAB上面的面具,你会得到掩盖,只有你想的位0xD7448EAB。以后,如果要遍历每一个,则需要将结果向右移动10并一次处理每个位(在位置0)。
答案可能更长一些,但它比使用0xff或其他硬编码更好的设计。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句