Перебрать 4-битное число. Python

Допустим, есть переменная bits с числом и answer.

bits = 4
answer = 1111

Нужно перебрать значения (0000, 0001...1111) а потом сравнивать с answer, а если переменная равна answer, вывести ее на экран. Еще одна задача - чтобы если переменная bits менялась (допустим она становилось цифрой 8), перебираемые значения тоже должны изменяться (00000000, 00000001...11111111)

Я пытался это сделать так:

bits = 4
answer = "1111"

x = bits*bits
y = []
for n in range(len(answer)):
    y.insert(n, 0)
for i in range(x):
    ans = ""
    for j in range(len(answer)):
        if y[j] == 0:
            ans += "0"
            y[j] = n
        else:
            ans += "1"
    print(ans)

Но при этом, выдавало 0000, а на следующий раз 1111


Ответы (3 шт):

Автор решения: Danis

можно использовать модуль itertools

import itertools

for i in itertools.product("01", repeat = 4):
    print("".join(i))
→ Ссылка
Автор решения: Zhihar

если не использовать строки (с ними все быстрее) и библиотеки, то:

value = 0

while value != 11111111111111:

    tmp = value + 1
    value = 0
    overflow = 0

    index = 0
    finish = False

    while finish is False:

        if tmp == 0:
            finish = True

        digit = tmp % 10 + overflow
        tmp //= 10

        overflow = digit > 1
        digit %= 2

        value += digit * 10**index
        index += 1

    print(value)
→ Ссылка
Автор решения: insolor
answer = '1111'

for i in range(0b1111 + 1): 
    if f'{i:04b}' == answer:
        print(answer)

Еще одна задача - чтобы если переменная bits менялась (допустим она становилось цифрой 8), перебираемые значения тоже должны изменяться (00000000, 00000001...11111111)

bits = 8

for i in range(2**bits):
    print(f'{i:0{bits}b}')

В строке форматирования f'{i:04b}':

  • b - переводить в двоичный (binary) вид
  • 04 - дополнять до 4 символов нулями слева (если оставить просто 4 без нуля, то будет дополняться пробелами)

В варианте с задаваемым переменной количеством бит вместо 4 из первого примера просто подставляется количество символов.


Вообще, лучше обойтись без строкового представления, перебирать и сравнивать целые числа, а в виде набора бит выводить только результат:

answer = 0b1111

for i in range(0b1111 + 1): 
    if i == answer:
        print(f'{i:04b}')
→ Ссылка