如何翻转二进制表示形式的位模式?

时间:2019-04-22 00:10:11

标签: python-3.x bit-manipulation

我有一个像这样的字符串 BGGBG 。现在我必须将所有 BG 翻转到 GB 。在此字符串中有两个 BG 。现在,如果我想将其表示为Binary (采用B = 0和G = 1),那么它将是 01101 。因此,我们希望将 01 翻转为 10 。这可能吗?如果是,该如何在 Python 中完成?

仅供参考不是翻转位(0到1,反之亦然),而是与翻转图案(在这种情况下,例如 01 )。

我知道我可以像这样使用str.replace():

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

实际上,这是在代码部队解决此问题的一种不错的方法。 https://codeforces.com/problemset/problem/266/B

2 个答案:

答案 0 :(得分: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 :(得分:2)

如果您的二进制字符串位于bg中,则仅在mask具有bg的位置将01设置为1。 flip中的1会加倍,然后与原始XORd进行运算以得到结果:

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