大家,
我是C的新手,我尝试用字节,二进制数和初学者的另一个重要的东西来理解这项工作。
我希望有人能在这方面把我推向正确的方向。
例如,我有一个32位数字11000000 10101000 00000101 0000000(3232236800)。 我还将该数字的每个部分分配为a = 11000000(192),b = 10101000(168),c = 00000101(5)d = 0000000(0)。我不确定我是否真的需要这个。
有没有办法找到号码中的最后1个并使用此位置来计算前导1的数量?
谢谢你的帮助!
答案 0 :(得分:1)
您可以通过以下公式确定第一个前导1的位位置:
floor(ln(number)/ln(2))
where" floor()"意味着四舍五入 为了统计连续的前导数量(如果我正确地得到你问题的第二部分),我只能想象一个循环。
注1:
公式是"以2"为基础的数字的对数的数学公式
同样适用于log10()
。基本上你可以使用任何对数(即任何基数)来适应不同的基数。
注2:
当然,这个公式是否比使用循环向下搜索MSB更有效,这当然是值得怀疑的。它可能具有良好的FPU支持。它可能不适用于8位值。如果您要进行速度优化,请仔细检查。
答案 1 :(得分:0)
对不起,我不是C专家,但这是我想出的Python代码:
num_ones = 0
while integer > 0:
if integer % 2 == 1:
num_ones += 1
else:
num_ones = 0
integer = integer >> 1
基本上,我通过对给定整数进行位移来计算连续1的数量。 零将重置计数器。