zoukankan      html  css  js  c++  java
  • 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 << 15) >> 15;
        uint16_t x2 = (x << 13) >> 15;
        uint16_t x3 = (x << 12) >> 15;
        uint16_t x4 = (x << 10) >> 15;
        uint16_t res = x1 ^ x2 ^ x3 ^ x4;
        x = (x >> 1) + (res << 15);
    }
    
    int main() {
        int8_t *numbers = (int8_t*)malloc(sizeof(int8_t) * 65536);
        if (numbers == NULL) {
            printf("Memory allocation failed!");
            exit(1);
        }
    
        memset(numbers, 0, sizeof(int8_t) * 65536);
        uint16_t reg = 0x1;
        uint32_t count = 0;
        int i;
    
        do {
            count++;
            numbers[reg] = 1;
            if (count < 24) {
                printf("My number is: %u
    ", reg);
            }
            else if (count == 24) {
                printf(" ... etc etc ... 
    ");
            }
    
            for (i = 0; i < 32; i++)   //生成一个数要调用32次
                lfsr_calculate(&reg);
        } while (numbers[reg] != 1);
    
        printf("Got %u numbers before cycling!
    ", count);
    
        if (count == 65535) {
            printf("Congratulations! It works!
    ");
        }
        else {
            printf("Did I miss something?
    ");
        }
    
        free(numbers);
    
        return 0;
    }

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

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

    参考链接:

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

    2. 题目资源

  • 相关阅读:
    [leetcode]N-Queens II
    基于Linux的智能家居的设计(4)
    eclipse集成Python开发环境
    创业三年,离开公司,请各位看一下我的简历,指点一下未来的路
    Jquery实现选项卡功能
    R语言中两个数组(或向量)的外积怎样计算
    《Java程序猿面试笔试宝典》之组合与继承有什么差别
    Sublime Text3打造U盘便携Lua IDE
    php Laravel 框架之建立后台目录
    树的同构(25 分)
  • 原文地址:https://www.cnblogs.com/lfri/p/11461201.html
Copyright © 2011-2022 走看看