查找二进制数

时间:2017-10-07 04:36:26

标签: c binary byte

大家,

我是C的新手,我尝试用字节,二进制数和初学者的另一个重要的东西来理解这项工作。

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

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

有没有办法找到号码中的最后1个并使用此位置来计算前导1的数量?

谢谢你的帮助!

2 个答案:

答案 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的数量。 零将重置计数器。