有没有内置的python函数来计算二进制字符串中的位翻转



是否有内置的python函数来计算二进制字符串中的位翻转?我试图解决的问题是,给定一个任意长度的二进制字符串,我如何返回该字符串的位翻转次数。例如,'01101'的位翻转数为3,'1110011'为2,等等。

我能想出的解决这个问题的方法是使用for循环和计数器。然而,这似乎太长了。有没有办法让我做得更快?或者python中是否有一个内置函数允许我直接执行此操作?谢谢你的帮助!

有一种非常快速的方法可以做到这一点,而无需任何显式循环,并且仅使用Python内置:您可以将字符串转换为二进制数,然后使用基于XOR的整数技巧检测所有位翻转,然后将整数转换回字符串计数位翻转次数。这是代码:

# Convert the binary string `s` to an integer: "01101" -> 0b01101
n = int(s, 2)
# Build a binary mask to skip the most significant bit of n: 0b01101 -> 0b01111
mask = (1 << (len(s)-1)) - 1
# Check if the ith bit of n is different from the (i+1)th bit of n using a bit-wise XOR:
# 0b01101 & 0b01111 -> 0b1101  (discard the first bit)
# 0b01101 >> 1      -> 0b0110
# 0b1101 ^ 0b0110   -> 0b1011
bitFlips = (n & mask) ^ (n >> 1)
# Convert the integer back to a string and count the bit flips: 0b1011 -> "0b1011" -> 3
flipCount = bin(bitFlips).count('1')

这个技巧比其他方法快得多,因为与基于循环的解释代码或处理迭代的代码相比,整数运算是非常优化的。以下是我的机器上大小为1000的字符串的性能结果:

ljdyer's solution:    96 us     x1.0
Karl's solution:      39 us     x2.5
This solution:         4 us    x24.0

如果您使用的是短有界字符串,那么还有更快的方法来计算整数中设置的位数。

不知道内置函数,但这里有一句话:

bit_flip_count = len([x for x in range(1, len(x0)) if x0[x] != x0[x-1]])

给定一系列值,您可以通过对连续的值进行分组,然后对组进行计数来计算值的更改次数。将比更改的数量多出一个组(因为第一次更改之前的元素也在一个组中(。(当然,对于空序列,这会得到-1的结果;您可能需要单独处理这种情况。(

Python中的分组是通过标准库itertools.groupby内置的。该工具只考虑连续的组,这通常是一个缺点(例如,如果你想制作直方图,你必须首先对数据进行排序(,但在我们的情况下,这正是我们想要的。这个工具的整体界面有点复杂,但在我们的情况下,我们可以简单地使用它:

from itertools import groupby
def changes_in(sequence):
return len(list(groupby(sequence))) - 1

最新更新