- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
最近,我反复碰到LFSR的概念,我发现它很有趣,因为它与不同领域的联系也很吸引人。我花了些力气才明白,最终的帮助是这个非常好的page,比起初的神秘wikipedia entry好得多。因此,我想为像LFSR一样工作的程序编写一些小代码。更确切地说,这以某种方式表明了LFSR的工作原理。经过一些长时间的尝试(Python),这是我能想到的最干净的东西:
def lfsr(seed, taps):
sr, xor = seed, 0
while 1:
for t in taps:
xor += int(sr[t-1])
if xor%2 == 0.0:
xor = 0
else:
xor = 1
print(xor)
sr, xor = str(xor) + sr[:-1], 0
print(sr)
if sr == seed:
break
lfsr('11001001', (8,7,6,1)) #example
我将XOR函数的输出命名为“xor”,不是很正确。
def lfsr(seed, taps):
import time
sr, xor = seed, 0
while 1:
for t in taps:
xor += int(sr[t-1])
if xor%2 == 0.0:
xor = 0
else:
xor = 1
print(xor)
print('')
time.sleep(0.75)
sr, xor = str(xor) + sr[:-1], 0
print(sr)
print('')
time.sleep(0.75)
然后让我震惊的是,这在编写软件中有什么用?我听说它可以生成随机数;是真的吗如何?
最佳答案
实际上,基于LFSR的算法非常普遍。 CRC实际上直接基于LFSR。当然,在计算机科学类(class)中,人们谈论的是多项式,而当他们谈论输入值应如何与累加值进行异或运算时,在电子工程学中,我们所讨论的却是抽头。它们是相同的,只是术语不同。
CRC32是非常常见的一种。它用于检测以太网帧中的错误。这意味着当我发布此答案时,我的电脑使用了基于LFSR的算法来生成IP数据包的哈希值,以便我的路由器可以验证其传输的内容是否未损坏。
Zip和Gzip文件是另一个示例。两者都使用CRC进行错误检测。 Zip使用CRC32,而Gzip使用CRC16和CRC32。
CRC基本上是哈希函数。它足以使互联网正常工作。这意味着LFSR是相当不错的哈希函数。我不确定您是否知道这一点,但通常来说,好的哈希函数被认为是好的随机数生成器。但是,LFSR的问题在于选择正确的抽头(多项式)对于哈希/随机数的质量非常重要。
您的代码通常是玩具代码,因为它对一串一和零进行运算。在现实世界中,LFSR处理字节中的位。插入LFSR的每个字节都会更改寄存器的累加值。该值实际上是您已推送通过寄存器的所有字节的校验和。使用该值作为随机数的两种常见方法是使用计数器,然后将一个数字序列插入寄存器,从而将线性序列1,2,3,4转换为某种哈希序列,例如15306、22、5587, 994,或将当前值反馈到寄存器中,以看似随机的顺序生成新数字。
应当指出的是,由于需要一次处理位,因此使用位摆弄的LFSR幼稚地执行此操作相当慢。因此,人们想出了使用预先计算的表来一次完成八位甚至一次达到32位的方法。这就是为什么您几乎从来没有在野外看到LFSR代码的原因。在大多数生产代码中,它伪装成其他东西。
但有时,普通的比特困惑LFSR可能会派上用场。我曾经为PIC单片机编写了一个Modbus驱动程序,该协议(protocol)使用了CRC16。预先计算的表需要256个字节的内存,而我的CPU只有68个字节(I'm not kidding)。因此,我不得不使用LFSR。
关于python - 线性反馈移位寄存器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3735217/
我想将这个无符号数:1479636484000 向右移动 7 位。这在 JavaScript 中可能吗? 两者 1479636484000 >> 7 和 1479636484000 >>> 7 返回错
鉴于以下代码: import matplotlib.pyplot as plt import numpy as np x = [1.0, 1.1, 2.0, 5.7] y = np.arange(le
我有一个低级键盘钩子(Hook),目前允许我从任何应用程序(包括游戏)中控制媒体播放器。 它通过查看捕获的特定击键来工作。 我想扩展它以查找键的组合。我可以对一些逻辑进行硬编码,但我觉得必须有一种更合
我需要一些帮助来理解这段C代码。我不知道这里的“L”和“\”是什么?请也说明一点:) #define l2n(l,c) (*((c)++)=(unsigned char)(((l)>>2
我正在查看一段代码: int result = 0 ; char byte = foo[j] for (i = 7 ; i>0 ; i--) { byte = (byte & ~0x1)>>1
我们有一个项目要求我们编写一个程序,允许用户输入一系列数字“将数字读入数组以进行进一步处理,用户通过输入负数表示他们已完成(负数不用于计算),在读取所有数字后执行以下操作,总结输入的#,计算输入的#,
锁定。有disputes about this question’s content正在解决中。它目前不接受新的答案或互动。 def menu(): choice = input("Pres
为什么如果 int x = -1 // binary: 11111111111111111111111111111111 x = x >>> 31; 我们有 000000000000000000000
我的问题其实应该很简单:我有一个玩家对象数组。(玩家[])我想要一个函数来旋转这个数组直到一个索引: public void rotateArray(Object[] array, int index
我有一个编码为 boost 动态位集的数字列表。我根据此列表中的任何数字可以采用的最大值动态选择此位集的大小。所以假设我有从 0 到 7 的数字,我只需要三位,我的字符串 0,2,7 将被编码为000
我能想到一些令人讨厌的低效方法来完成这项任务,但我想知道最好的方法是什么。 例如,我想复制一个字节中从第 3 位开始的 10 个字节,并像往常一样复制到一个指针。 有没有比一次复制一个移位字节更好的方
我正在尝试为该问题添加更多规则,并且该规则一直给我带来这种转变/减少冲突的能力,我不知道为什么会这样做,并且在过去的24小时内我一直在尝试解决问题 FuncDecl : RetTyp
This question already has answers here: Why does it make a difference if left and right shift are us
我在 Perl 中遇到这个问题已经有几天了,在搜索了无数的手册页、perldocs 和谷歌搜索了太多的搜索词之后,希望这里有人能帮助我。 我得到两个表示十六进制值的字符串,即“FFFF”,而不是 Pe
我有一个主 div,两个 div 水平并排放置在这个父 div 中。 .parent{ height: 360px; margin-top: 0px; bo
我想 float 我的元素列表并从第二个元素创建一个移动效果。 如何避免第二个 .item 之后的“清除”行为? .shift { float: right; width: 50%;
我正在使用 SSE3 优化我的代码。代码中有一点迫使我将 vector 中的所有元素移动一个元素 v[0] = 0 //v is some char* and N = v.size() for(i
.file "calcnew.c" .text .globl calcnew .type calcnew, @function calcnew:
我有一个点对象: class Point { final int x,y; ... } 因为这些点将在我的代码中到处使用/创建,所以我想开始使用 guavas 缓存。不幸的是
x = "Foo 890 bar *()" 如何将包括 "*()" 在内的小写字母“未移位”返回到 890?期望的结果: foo 890 bar 890 不需要的: x.lower() => "foo
我是一名优秀的程序员,十分优秀!