Как определять направление циклического сдвига двоичного кода на питоне?

Не могу понять, как определить направление циклического сдвига четырехпозиционного двоичного кода на питоне? Сдвиг происходи на 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 'ничего непонятно'
→ Ссылка