如何在二进制数组中找到孤立的零?

时间:2018-11-13 06:22:27

标签: arrays python-3.x binary

如果我有这样的二进制数-0b1110111110011011011010001000,并且我会传播5位,那么它看起来像:

11101 # 29  
11110 # 30  
01101 # 13  
10110 # 22  
01000 # 8

除了右边下方的0110/1000外,每个0都将被视为孤立的零,因此,首先,我编码为查找“ 101”,以查找

?1?
101
1 -它将在数组中找到孤立的零。

数组为[29,30,13,22,8]并使用字符串,

def find_closed(array,width = 5):
    new_arr = ['1'*(width+2)]+['1'+bin(x)[2:]+'1' for x in array]+['1'*(width+2)]
    for each in range(len(array)):
        a = new_arr[each+1].find('101') +1
        if a and int(new_arr[each][a]) &int(new_arr[each+2][a]):
            return each+1,a
    return False

因此代码将指出(1,4),第4行,第1列。

好吧,我是通过位移来实现的,

def bit_closed(array,width = 5):
    new_arr = [2**(width+2)-1]+[2**(width+1)+2*x+1 for x in array]+[2**(width+2)-1]
    for each in range(len(array)):
        for shift in range(width):
            if not ((new_arr[each+1]>>shift)-5)%8 and (new_arr[each]>>(shift+1))%2 and (new_arr[each+2]>>(shift+1))%2:
                return each+1, width - shift
    return False

实际上,我相信使用列表循环可能会更短。无论如何,还有更好的方法吗?

1 个答案:

答案 0 :(得分:0)

如果我们将2D列表[[],[],...]作为输入,

def matrix_closed(small):
    org = small[:]
    for objs in org:
        objs.append(1)
    org.append([1]*len(objs))
    n=0
    for lines in org[:-1]:
        x=0
        for points in lines[:-1]:
            if not points and all((org[n-1][x],org[n+1][x],org[n][x-1],org[n][x+1])):
                return n,x
            x+=1
        n+=1
    return False

它会在python中更快地工作,因为python本身不支持二进制数组。时间花费在函数调用上,而不是花一点时间。