Как перевернуть шаблон битов в двоичном представлении?

#python-3.x #bit-manipulation

#python-3.x #манипулирование битами

Вопрос:

У меня есть строка, подобная этой BGGBG. Теперь я должен перевернуть все BG в GB.В этой строке есть два BG.Теперь, если я хочу представить его как двоичный (принимая B = 0 и G = 1), тогда это будет 01101. Итак, из этого нужно перевернуть 01 на 10. Возможно ли это сделать? если да, то как это можно сделать на Python?

К вашему сведению: это не просто переворачивание битов (от 0 до 1 и наоборот).Скорее это связано с перелистыванием шаблона (например, 01 в данном случае).

Я знаю, что мог бы просто использовать str.replace() следующим образом:

 string=string.replace("BG","GB") # will replace all BG to GB
  

На самом деле это может быть достойным подходом к решению этой проблемы здесь, на codeforces. https://codeforces.com/problemset/problem/266/B

Ответ №1:

Если ваша двоичная строка находится в bg : это значение mask равно 1 только в позициях, где bg имеет a 01 . Единицы удваиваются flip и совпадают с оригиналом, чтобы получить результат:

 >>> bg = 0b00011011
>>> mask = bg amp; (~bg>>1)
>>> flip = mask|mask<<1
>>> result = bg ^ flip
>>> bin(result)
'0b00101101'
  

Комментарии:

1. Обратите внимание, что это даст неправильный ответ, если первый символ равен ‘G’ = 1, потому что начальные нули запускают обнаружение. Вам нужно будет отфильтровать их при преобразовании строки или при создании маски.

Ответ №2:

Я не утверждаю, что это лучший, наиболее устойчивый или даже приемлемый способ сделать это, но, безусловно, было весело писать это. Я надеюсь, что это приблизит вас к решению того, что вы пытаетесь решить:

 import re

# I’m assuming that the string is "((BG)*(GB)*)*"
# any other characters will make this fail
input = 'BGBGBGGBGBGB'
output = ''

for two in re.findall('..', input):
    output  = int.to_bytes(int.from_bytes(two.encode(), 'big') ^ 1285, 2, 'big').decode('ascii')

print(input)
print(output)
  

Комментарии:

1. Большое спасибо @Dodekeract. Я опробовал ваш код, но, похоже, он выделяет некоторые символы.

2. Можете ли вы быть более точным @AminAhmed?