Можно ли преобразовать код в одну строку
Есть следующий код. Можно ли его переписать в одну строку?
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)