Как определять направление циклического сдвига двоичного кода на питоне?
Не могу понять, как определить направление циклического сдвига четырехпозиционного двоичного кода на питоне? Сдвиг происходи на 1 бит. Например, у цифры 6 (original_state) двоичный код 0110. Если сдвинуть код влево, получится 1100. Как определить, что мы сместили влево код?
def find_shift_direction(original, shifted):
if len(original) != len(shifted):
raise ValueError("Длины двух бинарных чисел должны быть одинаковыми")
# Проверяем, есть ли различия в битах между двумя числами
differences = [i for i, (a, b) in enumerate(zip(original, shifted)) if a != b]
print(differences)
if not differences:
return "Нет сдвига" # Нет различий - сдвига нет
# Если есть различия, определяем направление сдвига
if differences[0] > differences[-1]:
return "Сдвиг влево"
else:
return "Сдвиг вправо"
# Пример использования
original_state = "0110" # Цифра 6
shifted_state = "1100" # 1100 - Должен показать влево, 0011- вправо
direction = find_shift_direction(original_state, shifted_state)
print("Направление сдвига:", direction)
Ответы (3 шт):
Автор решения: Эникейщик
→ Ссылка
- Если итоговое число больше в 2 раза — сдвиг влево.
- Если итоговое число больше в 2^(n-1) раз (где n — длина числа в символах) — сдвиг вправо.
- Если итоговое число меньше в 2 раза — сдвиг вправо.
- Если итоговое число меньше в 2^(n-1) раз (где n — длина числа в символах) — сдвиг влево.
Список неисчерпывающий. Например, сдвиги для числа 9 в 4-значной записи сюда не попадают.
Автор решения: MBo
→ Ссылка
Если гарантируется, что строка b является циклическим сдвигом а на один разряд:
print("Сдвиг в"+["право", "лево"][(a*2).find(b)==1])
Удваиваем первую строку. Если вторая является её циклическим сдвигом, то она встретится в удвоенной либо с позиции 1, либо с позиции len(b)-1
0110 и её сдвиги 0011 или 1100
01100110
1100
0011
Автор решения: Stanislav Volodarskiy
→ Ссылка
Проверить три варианта, выбрать подходящий:
def find_shift(a, b):
if a == b:
return 'нет сдвига'
if a[1:] + a[:1] == b:
return 'сдвиг налево'
if a[-1:] + a[:-1] == b:
return 'сдвиг направо'
return 'ничего непонятно'
