#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?