📜  二进制数(二进制中没有连续的1)(1)

📅  最后修改于: 2023-12-03 14:49:02.256000             🧑  作者: Mango

二进制数(二进制中没有连续的1)

二进制数是数字在计算机内部存储和处理时最基本的表示方法之一。在二进制数的表示中,每一位只能是0或1。但是在一些特定情况下,需要满足二进制数值不重复的限制,如无连续的1。

为什么需要二进制中没有连续的1

一个字节(byte)在计算机中通常表示为一个8位的二进制数,即8个0或1。在一些特别的应用场景下,比如IP地址、MAC地址等的表示,需要满足二进制数值不重复的限制。如果仅仅是为了表达一个数字,连续的1对于计算无影响。但是在特殊情况下,连续的1可能会产生歧义。

如何判断二进制数中是否有连续的1

一个二进制数中是否连续的1,实际上只需要判断它的补码(binary compliment)是否有连续的0即可。因为正数的补码就是其本身,在正数中,连续的0并不影响数值的大小。

例如,将十进制数10表示为二进制数为:0b1010,其补码为本身,因此不需要判断连续的0。

而将十进制数3表示为二进制数为:0b11,其补码为:0b01,有连续的0。

如何生成二进制中没有连续1的数

生成二进制数中没有连续1的数,可以使用贪心算法的思想。从高位到低位依次考虑每个二进制位置,如果该位置上的数字为0,那么该位置就放0;如果该位置上的数字为1,那么它的前一位不能放1,因此该位置就必须放0。这里要注意,从高位到低位的顺序是不能变的。

下面是一个python函数,生成n位二进制数中没有连续1的所有数值:

def gen_non_consecutive_ones(n):
    res = []
    def gen_helper(slate, idx):
        if idx == n:
            res.append(slate)
            return
        if len(slate) > 0 and slate[-1] == '1':
            gen_helper(slate+'0', idx+1)
        else:
            gen_helper(slate+'0', idx+1)
            gen_helper(slate+'1', idx+1)
    gen_helper('',0)
    return res
总结

二进制数在计算机中具有非常重要的地位,学会处理二进制数是每个程序员必备的基本技能。在二进制数的处理中,如果需要满足二进制数值不重复的限制,可以使用贪心算法的思想来生成没有连续1的二进制数。