Битовые операции Python со списком Int

Что я хочу сделать, но это не работает: Список целых...

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

Мои битовые функции (есть все обычные set,clear,toggle, test но здесь установлено)

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