2017-10-07 74 views
0

大家,查找领先1秒的二进制数

我用C新我试着去理解与字节的二进制数,并为初学者另一个重要的工作。

我希望有人能把我推向正确的方向。

例如,我有一个32位数字11000000 10101000 00000101 0000000(3232236800)。 我还将这个数字的每个部分分配为a = 11000000(192),b = 10101000(168),c = 00000101(5)d = 0000000(0)。我不确定我是否真的需要这个。

有什么方法可以找到数字中的最后1位,并使用此位置来计算前导1的数量?

谢谢你的帮忙!

+1

查找'10101000'中的最后一个1并不能告诉你有多少其他的1(有多少*可以*)。无论如何,对于初学者来说,这是非常不重要的。 –

回答

1

可以通过这个公式确定所述第一前导1的bitposition:

floor(ln(number)/ln(2)) 

其中 “floor()” 是指下舍入。
为了计算连续的前导数(如果我正确地得到了问题的第二部分),我只能想象一个循环。

注1:
的公式为“2的基础上数的对数”的数学公式。
log10()相同。基本上你可以使用任何对数(即任何基数)来适应不同的基数。

注2:
这个公式是否比从MSB向下循环搜索更有效率当然是有问题的。它可能具有良好的FPU支持。它可能不适用于8位值。仔细检查你是否正在加速优化。

+0

你能告诉我你是如何到达这个公式的? –

+0

@J ... S感谢您的评论,我因此改进了答案。 – Yunnosch