Добавление двоичных массивов с другим размером - PullRequest
0 голосов
/ 13 ноября 2018

Я сделал двоичные массивы из числа и его длины в битах на строку, если 295289042101659 с 6 битами на строку, чисел размером 49 бит, то в массиве это будет строка 6 битов X 9, через код и изменена на 6-длину заполненные нулями строки:

def listify(a, bit = 5):
    res = []
    while a:
        a, b = divmod(a,2**bit)
        res.append(b)
    return res[::-1]

000001
000011
001001
000001
010110
011101
011110
010110
011011

Поскольку это двоичный массив, я использовал двоичный код сложения без переноса:

def binaryadd(one, other):
    if one & other:
        return False
    return one | other

Если я получу некоторый массив из 402 (0b110010010) с размером 3, то как я могу добавить в массив в точке (2,2) координату сверху вниз или (3,6) снизу до , координата справа налево? Это должно выглядеть так:

000001
* 1020 00 * 11 11
* 1023 001 * 1 01
000 * 1 026 * 1 * +1027 * 01
010110
011101
011110
010110
011011

Я сделал это так:

def array_add(one,another, point = (0,0)):
    a = [a*2**point[0] for a in another[:]]
    a+=[0]*point[1]
    a = [0]*(len(one)-len(a))+a
    res = [binaryadd(a,b) for a, b in  zip(one[::-1],a[::-1])][::-1]
    if not all(res):
        return False
    return res

Лучший способ сделать это - применить двоичное добавление к каждому значению списка, изменив один список?

Или я неправильно понимаю основы массива?

1 Ответ

0 голосов
/ 13 ноября 2018

Поскольку вы упоминаете тег numpy, вы можете использовать его для обеспечения высокой производительности и читабельности кода:

import numpy as np

def int_to_array(n,width):
    v=np.zeros(64,np.uint8)
    i,u,total=0,n,0
    while(u):
      if i%width == 0 : total += width  
      u,v[i],i = u//2,u%2,i+1
    return v[:total][::-1].reshape(-1,width)  

def add(a,b,point=(0,0)):
    sx,sy = point
    ex = sx+b.shape[0]
    ey = sy+b.shape[1]
    a[sx:ex,sy:ey] |= b

a=int_to_array(295289042101659,6)
b=int_to_array(402,3)
print(a)
print(b)
add(a,b,(2,2))   
print(a)

Для:

[[0 0 0 0 0 1]
 [0 0 0 0 1 1]
 [0 0 1 0 0 1]
 [0 0 0 0 0 1]
 [0 1 0 1 1 0]
 [0 1 1 1 0 1]
 [0 1 1 1 1 0]
 [0 1 0 1 1 0]
 [0 1 1 0 1 1]]

[[1 1 0]
 [0 1 0]
 [0 1 0]]

[[0 0 0 0 0 1]
 [0 0 0 0 1 1]
 [0 0 1 1 0 1]
 [0 0 0 1 0 1]
 [0 1 0 1 1 0]
 [0 1 1 1 0 1]
 [0 1 1 1 1 0]
 [0 1 0 1 1 0]
 [0 1 1 0 1 1]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...