Преобразование целых чисел в биты: ошибка типа: индексы строк должны быть целыми числами — Python3

#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" .