如何从32位数字中提取位

用户名

由于我的一位同事正在休假,所以我对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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章