C语言实验二——位运算
问题
线性反馈移位寄存器
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(®);
} 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中的数,然后再循环。
选取不同的初始值,只是循环的起点不同,循环还是同一个。
参考链接:
2. 题目资源
C语言实验二——位运算的更多相关文章
- C/C++语言中的位运算
在计算机程序中,数据的位是可以操作的最小数据单位,理论上可以用“位运算”来完成所有的运算和操作. 一般的位操作是用来控制硬件的,或者做数据变换使用,但是,灵活的位操作可以有效地提高程序运行的效率.C语 ...
- 深入理解计算机系统(2.2)---布尔代数以及C语言上的位运算
布尔代数上的位运算 布尔代数是一个数学知识体系,它在0和1的二进制值上演化而来的. 我们不需要去彻底的了解这个知识体系,但是里面定义了几种二进制的运算,却是我们在平时的编程过程当中也会遇到的.这四种运 ...
- C语言中的位运算和逻辑运算
这篇文章来自:http://blog.csdn.net/qp120291570/article/details/8708286 位运算 C语言中的位运算包括与(&),或(|),亦或(^),非( ...
- C语言中的位运算的技巧
一.位运算实例 1.用一个表达式,判断一个数X是否是2的N次方(2,4,8,16.....),不可用循环语句. X:2,4,8,16转化成二进制是10,100,1000,10000.如果减1则变成01 ...
- go语言-二进制与位运算
一.进制介绍 1.二进制:0,1 -->不能直接用二进制来表示一个整数,用%b输出二进制 package mainimport "fmt"func main() { var ...
- C语言基础知识--位运算
1.原码,反码,补码: (1)在n位的机器数中,最高位为符号位,该位为零表示为正,为一表示为负:其余n-1位为数值位,各位的值可为零或一.当真值为正时,原码.反码.补码数值位 完全相同:当真值为负时, ...
- #C语言初学记录(位运算)
位运算 Problem Description7-1 数组元素循环右移问题 一个数组A中存有N(>0)个整数,在不允许使用另外数组的前提下,将每个整数循环向右移M(≥0)个位置,即将A中的数据由 ...
- 2.2 Go语言基础之位运算操作
一.位运算符 位运算符对整数在内存中的二进制位进行操作. 运算符 描述 & 参与运算的两数各对应的二进位相与. (两位均为1才为1) | 参与运算的两数各对应的二进位相或. (两位有一个为1就 ...
- 2.1 C语言下的位运算
位运算符: 注:运算量仅仅能为整型和字符型数据,不能是实数型的数据. 当进行&运算时:0&1=0.1&0=0:1&1=1:0&0=0: 当进行|运算时:0|1= ...
随机推荐
- LeetCode 240. 搜索二维矩阵 II(Search a 2D Matrix II) 37
240. 搜索二维矩阵 II 240. Search a 2D Matrix II 题目描述 编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target.该矩阵具有以下特性 ...
- [转帖]Linux教程(13)- Linux中的通配符和正则表达式
Linux教程(13)- Linux中的通配符和正则表达式 2018-08-22 06:16:44 钱婷婷 阅读数 39更多 分类专栏: Linux教程与操作 Linux教程与使用 版权声明:本文 ...
- 转载:c++获取本机IP地址
windows下获取IP地址的两种方法: 一种可以获取IPv4和IPv6,但是需要WSAStartup: 一种只能取到IPv4,但是不需要WSAStartup: 如下: 方法一:(可以获取IPv4和I ...
- bzoj 4500 矩阵 题解
题意: 有一个 $ n * m $ 的矩阵,初始每个格子的权值都为 $ 0 $,可以对矩阵执行两种操作: 选择一行,该行每个格子的权值加1或减1. 选择一列,该列每个格子的权值加1或减1. 现在有 $ ...
- Win32API文本处理
工程模板:https://www.cnblogs.com/eternalmoonbeam/p/10793080.html 安全的文本输出方式: 需要额外包含头文件strsafe.h 依次使用以下三个函 ...
- Fedora30 - Xrdp 远程桌面
Windows RDP 访问 Fedor 远程桌面需要使用 Xrdp 开源工具. [lipandeng@localhost ~]$ sudo dnf install xrdp [lipandeng@l ...
- python基础 — turtle 介绍
一.基础概念 1.画布:画布就是turtle为我们展开用于绘图区域, 我们可以设置它的大小和初始位置.常用的画布方法有两个:screensize()和setup(). (1)turtle.screen ...
- FreeMarker 教程整理
Freemarker新手教程 http://blog.csdn.net/qq_23994787/article/details/77506980 FreeMarker教程整理 http://blo ...
- Spring AOP创建Throwdvice实例
1.异常发生的时候,通知某个服务对象做处理 2.实现throwsAdvice接口 接口实现: public interface IHello { public void sayHello(String ...
- python3.7 64位中安装pygame1.9.3
1.我是用pip命令来安装的,首先,打开cmd,输入pip,检查电脑中有没有安装这个插件(一般python2.7以上自带pip工具) 2.更新pip工具的命令:python -m pip instal ...