#python #python-3.x #integer #bit
#python #python-3.x #целое число #бит
Вопрос:
Я пытаюсь запустить эту программу, которая подсчитывает единицы в битовом представлении int
s . Вот код:
def count_bits(n):
return bin(n).replace("0b", "")
bits = count_bits(3)
for i in bits:
if bits[i] == 1:
counter = 1
else:
counter = counter
Но когда я пытаюсь запустить его, я получаю следующую ошибку:
if bits[i] == 1:
TypeError: string indices must be integers
Комментарии:
1. Попробуйте
if bits[int(i)] == 1:
2. Тип
bits[i]
— целое число, попробуйте преобразовать его или stringify== '1'
Ответ №1:
Вы перебираете bits
, что является строкой, поэтому вы i
принимаете значение символов в этой строке. Вам нужно либо сначала преобразовать все символы в целые числа, либо найти лучший способ перебора битов.
Простое решение:
def count_bits(n):
return list(map(int, bin(n).replace("0b", "")))
Или вы можете использовать bits[int(i)]
.
Однако лучшим и более питоническим решением было бы сделать это математически, используя битовые сдвиги и генератор:
def bits(n):
while n:
yield n amp; 1
n >>= 1
counter = sum(bits(n))
Ответ №2:
Поскольку вы выполняете итерацию bits
, которая является строкой, i
она также будет строкой, и вы сравниваете ее с 1, что является an int
. Вам нужно либо сделать что-то вроде этого
def count_bits(n):
return bin(n).replace("0b", "");
bits = count_bits(3);
for i in range(len(bits)):
if bits[i] == 1:
counter = 1;
else:
counter = counter;
так i
будет int
, и вы сравниваете его с int 1
, или что-то вроде этого
def count_bits(n):
return bin(n).replace("0b", "");
bits = count_bits(3);
for i in bits:
if bits[i] == "1":
counter = 1;
else:
counter = counter;
таким i
образом, будет a string
, как и изначально, но вы сравниваете его с a string "1"
.