问题

线性反馈移位寄存器

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. LeetCode 240. 搜索二维矩阵 II(Search a 2D Matrix II) 37

    240. 搜索二维矩阵 II 240. Search a 2D Matrix II 题目描述 编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target.该矩阵具有以下特性 ...

  2. [转帖]Linux教程(13)- Linux中的通配符和正则表达式

    Linux教程(13)- Linux中的通配符和正则表达式 2018-08-22 06:16:44 钱婷婷 阅读数 39更多 分类专栏: Linux教程与操作 Linux教程与使用   版权声明:本文 ...

  3. 转载:c++获取本机IP地址

    windows下获取IP地址的两种方法: 一种可以获取IPv4和IPv6,但是需要WSAStartup: 一种只能取到IPv4,但是不需要WSAStartup: 如下: 方法一:(可以获取IPv4和I ...

  4. bzoj 4500 矩阵 题解

    题意: 有一个 $ n * m $ 的矩阵,初始每个格子的权值都为 $ 0 $,可以对矩阵执行两种操作: 选择一行,该行每个格子的权值加1或减1. 选择一列,该列每个格子的权值加1或减1. 现在有 $ ...

  5. Win32API文本处理

    工程模板:https://www.cnblogs.com/eternalmoonbeam/p/10793080.html 安全的文本输出方式: 需要额外包含头文件strsafe.h 依次使用以下三个函 ...

  6. Fedora30 - Xrdp 远程桌面

    Windows RDP 访问 Fedor 远程桌面需要使用 Xrdp 开源工具. [lipandeng@localhost ~]$ sudo dnf install xrdp [lipandeng@l ...

  7. python基础 — turtle 介绍

    一.基础概念 1.画布:画布就是turtle为我们展开用于绘图区域, 我们可以设置它的大小和初始位置.常用的画布方法有两个:screensize()和setup(). (1)turtle.screen ...

  8. FreeMarker 教程整理

    Freemarker新手教程 http://blog.csdn.net/qq_23994787/article/details/77506980   FreeMarker教程整理 http://blo ...

  9. Spring AOP创建Throwdvice实例

    1.异常发生的时候,通知某个服务对象做处理 2.实现throwsAdvice接口 接口实现: public interface IHello { public void sayHello(String ...

  10. python3.7 64位中安装pygame1.9.3

    1.我是用pip命令来安装的,首先,打开cmd,输入pip,检查电脑中有没有安装这个插件(一般python2.7以上自带pip工具) 2.更新pip工具的命令:python -m pip instal ...