Если у меня есть двоичное число вроде этого - 0b1110111110011011011001000, и я бы вывел на 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
На самом деле я считаю, что это может быть еще короче, используя циклы списка.В любом случае, есть ли лучший способ сделать это?