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)