python中的二进制位翻转发生器

时间:2015-06-08 21:24:06

标签: python python-3.x

我目前正在使用AccessViolationException函数以给定的位翻转概率翻转二进制列表中的二进制机器人。我遇到的问题是我想在我的两个中保持一个常数1原始和嘈杂的矢量。

提前致谢。

2 个答案:

答案 0 :(得分:3)

位翻转操作基本上是独占或xor)运算符。因此,给定一个数字和一个掩码(掩码只是一个数字,在你要翻转的位位置为1,而在其他地方为0,例如0b00000011会翻转两个不太重要的位),只是:

x = 8  # '0b00001000'
mask = 7  # '0b00000111'
flipped = x ^ y  # '0b00001111 --> 15'

如果位翻转概率是均匀的(50%),您可以按如下方式生成随机掩码:

import random

mask = random.randint(0, 2**8)  # assuming you are working with 8 bit numbers
在给定的示例中,

注意,我假设8位长数,但扩展到更长的二进制表示应该是微不足道的。此外,这假设无符号整数(无符号位)。要处理有符号整数,您还需要实现该逻辑。

修改

如果您想处理一般情况,即每个位位置可以以不同的概率翻转,您可以执行以下操作来生成翻转掩码:

def helper(cum, p):
    cum <<= 1
    return cum + int(random.random() <= p)

mask = reduce(helper, [0.25, 0, 1], 0)

在前面的例子中,较低有效位(LSB)将始终被翻转,第二个LSB不会被翻转(0%概率),第三个LSB将以25%的概率被翻转。

答案 1 :(得分:1)

import random

def applyNoise(bytes, bitFlipProbability):

  def applyByteNoise(byte):
    noisedByte = byte
    for bitPos in range(8):
      if random.random() < bitFlipProbability:
        noisedByte ^= 1 << bitPos
    return noisedByte

  return (applyByteNoise(byte) for byte in bytes)

print(list(applyNoise([ 1,2,3,4,5 ], 0.03)))

这回复了我。 G:

[35, 2, 3, 12, 5]