Можно ли преобразовать код в одну строку

Есть следующий код. Можно ли его переписать в одну строку?

b = list(bin(5))
for i in range(3, len(b), 2):
    b[i], b[i - 1] = b[i - 1], b[i]
b = "".join(b)
b = int(b, 2)

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

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

если в лоб микроскопом по гвоздям, то так например:

value = 152
new = int('0b' + ''.join(obj[0] + obj[1] for obj in zip(('0' * (len(str(bin(value))[2:]) % 2) + str(bin(value))[2:])[1::2], ('0' * (len(str(bin(value))[2:]) % 2) + str(bin(value))[2:])[::2])), 2)

print(new)

вариант 2:

new = ((value & 0b10101010101010101) << 1) | ((value & 0b101010101010101010) >> 1)

0b10101010101010101 можно составить нужной длины зная число value через логарифмы получить число 0b11...111 / 0b11 - т.е. (2**n - 1) / 3, где n - длина числа в битах (log(value) / log(2) + 1)

как вариант полного решения:

new = ((value & ((2**math.ceil(math.log2(value)) - 1) // 3)) >> 1) | ((value & (((2**math.ceil(math.log2(value)) - 1) // 3 * 2) + 1)) << 1)
→ Ссылка