Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python中的二进制位翻转生成器_Python_Python 3.x - Fatal编程技术网

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

python中的二进制位翻转生成器,python,python-3.x,Python,Python 3.x,我目前正在使用commpy.channels.bsc函数以给定的位翻转概率翻转二进制列表中的二进制bot,我遇到的问题是,我希望在原始向量和噪声向量中保持恒定的1数 提前谢谢 位翻转操作基本上是一个异或(xor)运算符。因此,给定一个数字,掩码(掩码只是一个数字,在要翻转的位位置上有1,在其他位置上有0,例如,0b000011将翻转两个低有效位)就是: import random def applyNoise(bytes, bitFlipProbability): def applyBy

我目前正在使用
commpy.channels.bsc
函数以给定的位翻转概率翻转二进制列表中的二进制bot,我遇到的问题是,我希望在原始向量和噪声向量中保持恒定的1数


提前谢谢

位翻转操作基本上是一个异或(
xor
)运算符。因此,给定一个数字,掩码(掩码只是一个数字,在要翻转的位位置上有1,在其他位置上有0,例如,
0b000011
将翻转两个低有效位)就是:

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)))
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)
def助手(cum,p):

你搜索了一些函数。但是,你能告诉我们到目前为止你还尝试了什么吗?我投票把这个问题作为离题题来结束,因为这纯粹是要求某人提供代码,而不是回答特定的问题。如果你想在这里得到好的帮助,你需要问一个关于特定问题的问题,告诉我们你发现了什么以及为什么它不适合你。请参阅以获取指导。您的答案缺少p的解决方案≠ 0.5 ;-)@阿尔夫:是的。我已经编辑了我的答案,提出了一个更一般的解决方案,它允许每个位的不同翻转概率-D
def helper(cum, p):
    cum <<= 1
    return cum + int(random.random() <= p)

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