问题

线性反馈移位寄存器

Linear feedback shift register(LFSR),是指给定前一状态,将该输出的线性函数再用作输入的移位寄存器。异或运算是最常见的单比特线性函数:对寄存器的某些位进行异或操作后作为输入,再对寄存器中的各个比特进行整体移位。

赋给寄存器的初始值叫做“种子”,因为线性反馈移位寄存器的运算是确定的,所以,由寄存器所生成的数据流完全取决于寄存器当时或之前的状态。而且,由于寄存器状态是有限的,它最终肯定会是一个重复的循环。然而,通过本原多项式,线性反馈移位寄存器可以生成循环周期非常长的序列。

Fibonacci LFSRs

例如,16-位 Fibonacci LFSRR

其含义是:第11、13、14、16位上的值异或作为第一位,剩下的位后移。

影响下一个状态的比特位的叫做抽头,图中抽头序列为[16, 14, 13, 11]。

有结论:找到合适的抽头,能使得LFSR长度达到最大,最大长度的序列能通过 $2^n-1$ 个内部状态,不包括全零。

实现

模拟一下就好了

#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <string.h> void lfsr_calculate(uint16_t *reg) {
uint16_t &x = *reg;
uint16_t x1 = (x << ) >> ;
uint16_t x2 = (x << ) >> ;
uint16_t x3 = (x << ) >> ;
uint16_t x4 = (x << ) >> ;
uint16_t res = x1 ^ x2 ^ x3 ^ x4;
x = (x >> ) + (res << );
} int main() {
int8_t *numbers = (int8_t*)malloc(sizeof(int8_t) * );
if (numbers == NULL) {
printf("Memory allocation failed!");
exit();
} memset(numbers, , sizeof(int8_t) * );
uint16_t reg = 0x1;
uint32_t count = ;
int i; do {
count++;
numbers[reg] = ;
if (count < ) {
printf("My number is: %u\n", reg);
}
else if (count == ) {
printf(" ... etc etc ... \n");
} for (i = ; i < ; i++) //生成一个数要调用32次
lfsr_calculate(&reg);
} while (numbers[reg] != ); printf("Got %u numbers before cycling!\n", count); if (count == ) {
printf("Congratulations! It works!\n");
}
else {
printf("Did I miss something?\n");
} free(numbers); return ;
}

这个程序,能随机产生65535个1~65535中的数,然后再循环。

选取不同的初始值,只是循环的起点不同,循环还是同一个。

参考链接:

1. 维基百科——线性反馈移位寄存器

2. 题目资源

C语言实验二——位运算的更多相关文章

  1. C/C++语言中的位运算

    在计算机程序中,数据的位是可以操作的最小数据单位,理论上可以用“位运算”来完成所有的运算和操作. 一般的位操作是用来控制硬件的,或者做数据变换使用,但是,灵活的位操作可以有效地提高程序运行的效率.C语 ...

  2. 深入理解计算机系统(2.2)---布尔代数以及C语言上的位运算

    布尔代数上的位运算 布尔代数是一个数学知识体系,它在0和1的二进制值上演化而来的. 我们不需要去彻底的了解这个知识体系,但是里面定义了几种二进制的运算,却是我们在平时的编程过程当中也会遇到的.这四种运 ...

  3. C语言中的位运算和逻辑运算

    这篇文章来自:http://blog.csdn.net/qp120291570/article/details/8708286 位运算 C语言中的位运算包括与(&),或(|),亦或(^),非( ...

  4. C语言中的位运算的技巧

    一.位运算实例 1.用一个表达式,判断一个数X是否是2的N次方(2,4,8,16.....),不可用循环语句. X:2,4,8,16转化成二进制是10,100,1000,10000.如果减1则变成01 ...

  5. go语言-二进制与位运算

    一.进制介绍 1.二进制:0,1 -->不能直接用二进制来表示一个整数,用%b输出二进制 package mainimport "fmt"func main() { var ...

  6. C语言基础知识--位运算

    1.原码,反码,补码: (1)在n位的机器数中,最高位为符号位,该位为零表示为正,为一表示为负:其余n-1位为数值位,各位的值可为零或一.当真值为正时,原码.反码.补码数值位 完全相同:当真值为负时, ...

  7. #C语言初学记录(位运算)

    位运算 Problem Description7-1 数组元素循环右移问题 一个数组A中存有N(>0)个整数,在不允许使用另外数组的前提下,将每个整数循环向右移M(≥0)个位置,即将A中的数据由 ...

  8. 2.2 Go语言基础之位运算操作

    一.位运算符 位运算符对整数在内存中的二进制位进行操作. 运算符 描述 & 参与运算的两数各对应的二进位相与. (两位均为1才为1) | 参与运算的两数各对应的二进位相或. (两位有一个为1就 ...

  9. 2.1 C语言下的位运算

    位运算符: 注:运算量仅仅能为整型和字符型数据,不能是实数型的数据. 当进行&运算时:0&1=0.1&0=0:1&1=1:0&0=0: 当进行|运算时:0|1= ...

随机推荐

  1. [转帖]Linux教程(12)- linux输入输出重定向

    Linux教程(12)- linux输入输出重定向 2018-08-21 22:57:02 钱婷婷 阅读数 49更多 分类专栏: Linux教程与操作 Linux教程与使用   版权声明:本文为博主原 ...

  2. dubbo学习之路-SPI机制

    dubbo学习之路-SPI机制 1.SPI 1.1Java SPI 原理 SPI是service provider interface简称.在java JDK中 内置的一种服务提供发现机制.它解决在一 ...

  3. Java开发笔记(一百三十)Swing的选择框

    不管是AWT还是Swing,都把选择框分成两类:复选框和单选按钮,这两类控件无论是外观上还是功能上均有显著差异.例如,在外观方面,复选框是在方框内打勾,而单选按钮是在圆圈内画圆点:在功能方面,复选框允 ...

  4. mysql中数据表记录的增删查改(2)

    select `数据表.字段1`, group_concat(`数据表.字段2`) from `数据表` group by `数据表.字段1` order by `数据表.字段1` desc; sel ...

  5. python学习-38迭代器和生成器

    迭代器和生成器 ---- 迭代器协议和for循环工作机制 1.迭代器协议:对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么引起一个Stoplteration异常,以终止迭代(只能往 ...

  6. 10 IO流(七)——copy方法封装、关闭流方法封装的两种方式以及try...with...resource

    前言 本文将上一节做的代码,对copy方法与关闭流方法进行封装,并使用try...with...resource关闭流. copy方法封装 我们将copy方法封装,使得只需传入两个流,就能将输入流的源 ...

  7. REST-framework之频率组件

    REST-framework之频率控制 一 频率简介 为了控制用户对某个url请求的频率,比如,一分钟以内,只能访问三次 二 自定义频率类,自定义频率规则 自定义的逻辑 ""&qu ...

  8. HA 高可用集群概述及其原理解析

    HA 高可用集群概述及其原理解析 1. 概述 1)所谓HA(High Available),即高可用(7*24小时不中断服务). 2)实现高可用最关键的策略是消除单点故障.HA严格来说应该分成各个组件 ...

  9. IdentityServer4之Jwt身份验证方案分析

    一,准备内容 在之前讲过的asp.net core 实现OAuth2.0四种模式系列中的IdentityApi客户端用到了以下配置代码 public void ConfigureServices(IS ...

  10. 报告题目:HAO智能:HI + AI + OI

     报告题目:HAO智能:HI + AI + OI 报告摘要:大数据面向异构自治的多源海量数据, 旨在挖掘数据间复杂且演化的关联.大数据知识工程(BigKE)从大数据的 HACE定理开始, 从大知识建模 ...