Python Bit Operations в списък с Int

Това, което искам да направя, но не работи: Списък с int...

BebossArray=[0 for i in xrange(1024)]

Моите битови функции (има всички обичайни набор, изчистване, превключване, тест, но тук е зададено)

def setBit(dint, offset):
mask = 1 << offset
dint=(dint|mask)
return

така че бих искал да задам малко в едно от целите в списъка...

setBit(DebossArray[index],3)

Това, разбира се, не работи. Присвояването в setBit просто създава нов обект и DebossArray[index] остава поставен както се очаква. Така че разбирам, че INT са неизменни, така че не мога да направя промяна на място.

Какво направих... (не ми харесва, но работи за моите цели)

DebossArray=[ctypes.c_int32() for x in xrange(1024)]

и

def setBit(dint, offset):
mask = 1 << offset
dint.value=(dint.value|mask)
return

така че сега

setBit(DebossArray[index],3]

работи според очакванията, защото ctype.c_int32() Е променлив, така че мога да го променя на място.

Използвам 2.7, но преминаването до 3 вероятно ще се случи по-късно в проекта. Също така се опитвам да стоя далеч от

DebossArray[index]=setBit(DebossArray[index],3)

тип конструкция.

Повече подробности: На някои места имам DebossArray[x], а на други места имам ButtonArray[x][y]

И сега към точката; Какъв е правилният начин да направите това?


person Burtski    schedule 12.03.2014    source източник


Отговори (3)


Мисля, че прекалено усложнявате това, просто върнете резултата и обвържете отново оригиналното име:

def setBit(dint, offset):
    mask = 1 << offset
    return dint | mask

r = 0
r = setBit(r, 5)
# 32

Всъщност дори не се нуждаете от функция, можете просто да направите:

i = 0
i |= (1 << 5)
# 32
person Jon Clements♦    schedule 12.03.2014
comment
Специално се опитвах да стоя далеч от конструкцията r=setBit(r,5). - person Burtski; 12.03.2014
comment
@Burtski Е, това и твоето DebossArray[index]=setBit(DebossArray[index],3) е почти толкова добро, колкото може, без да го прави сложна... - person Jon Clements♦; 12.03.2014
comment
Колкото и да исках да стоя далеч от конструкцията r=setBit(r,x), това изглежда е единственият чист начин да го направя. - person Burtski; 15.03.2014

Използвайте клас като този:

class BebossArray(object):
    def __init__(self):
        self._l = [0 for i in xrange(1024)]

    def setBit(self, index, offset):
        self._l[index] = (self._l[index]|1 << offset) 

Или просто накарайте setBit да приеме списък, индекс и отместване и да замени стойността в индекса с нова стойност.

person Ben    schedule 12.03.2014

Имате предвид нещо такова?

DebossArray = [0 for i in xrange(4)]

def setBit(dint, index, offset):
    dint[index] |= 1 << offset

print DebossArray  # [0, 0, 0, 0]
setBit(DebossArray, 2, 3)
print DebossArray  # [0, 0, 8, 0]
person martineau    schedule 12.03.2014