Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import java.util.ArrayList;
- import java.util.Arrays;
- import java.util.List;
- public class LFSR {
- public final int mask; // маска
- public final int defaultValue; // значение по умолчанию
- public final int bitsMask; // битовая маска
- public static int period; // счетчик периода
- public static int[] massRandInt = new int[256]; // массив случайных элементов
- private static final int sizeOfBlock = 8; // размер нашего битового блока (1 байт)
- private static final int bits = 8; // работаем в 8-ми битной системе
- private int current; // текущее значение
- private int next; // следущее
- // Конструктор класса mask - формула в hex системе счисления, defaultValue - значение по умолчанию
- public LFSR (int mask, int defaultValue) {
- this.bitsMask = (0x01 << bits) - 1;
- this.mask = mask & bitsMask;
- this.defaultValue = defaultValue & bitsMask;
- this.current = this.defaultValue;
- this.next = next (this.defaultValue, this.bitsMask, this.mask);
- }
- public int next () {
- this.current = this.next;
- this.next = next (this.current, this.bitsMask, this.mask);
- return this.current;
- }
- public int next (int n) {
- for (int i = 0; i < n; i++)
- next();
- return this.current;
- }
- public static int next(int in, int bitsMask, int mask) {
- return (in << 1) & bitsMask | lsb (in, bitsMask, mask);
- }
- public static int lsb(int value, int bitsMask, int mask) {
- int bit = 0;
- for (int i = 0x01; i < bitsMask; i <<= 1)
- if ((mask & i) != 0 && (value & i) != 0)
- bit ^= 0x01;
- return bit;
- }
- public static String[] intArrayToStringArray(int[]intArray, int periodIntArray){
- String[] stringRandomNums = new String[periodIntArray + 1];
- for (int i = 0; i <= periodIntArray; i++) {
- stringRandomNums[i] = Integer.toBinaryString(intArray[i]);
- }
- return stringRandomNums;
- }
- public static void printString(String[] array, int periodArray){
- for (int i = 0; i <= periodArray ; i++) {
- System.out.print(array[i]);
- }
- }
- public static int count_1(String input) {
- return (int) Arrays.stream(input.split("")).filter(s -> s.toLowerCase().equals("1")).count();
- }
- public static int count_0(String input) {
- return (int)Arrays.stream(input.split("")).filter(s -> s.toLowerCase().equals("0")).count();
- }
- public static int bin2dec(String binNumber) {
- return Integer.parseInt( binNumber, 2);
- }
- private static String Right_length(String myString, int length){
- while (myString.length() != length){
- StringBuilder new_column = new StringBuilder(myString);
- new_column.insert(0,"0");
- myString = new_column.toString();
- }
- return myString;
- }
- public static StringBuilder concat(String[] array ) {
- StringBuilder builder = new StringBuilder();
- for (String s : array) {
- builder.append(s);
- }
- return builder;
- }
- public static List<String> bitsList(String array){
- List<String> sequenceOfBitChunks = new ArrayList<>();
- for(int i = 0; i + sizeOfBlock <= array.length(); i = i + sizeOfBlock){
- sequenceOfBitChunks.add(array.substring(i, i + sizeOfBlock));
- }
- return sequenceOfBitChunks;
- }
- public static int getCountMod2(List<String> list) {
- int count = 0;
- for (String str8 : list
- ) {
- if (bin2dec(str8) % 2 == 0) count++;
- }
- return count;
- }
- public static int getCountNoMod2(List<String> list) {
- int count = 0;
- for (String str8 : list
- ) {
- if (bin2dec(str8) % 2 != 0) count++;
- }
- return count;
- }
- public static void main(String[] args) {
- LFSR l2 = new LFSR ( 0xC4 , 20); // запись в скобке: (X^8 + x^7 + x^2 + 1, число по умолчанию)
- for (int i = 0; i < 255 ; i++) {
- massRandInt[i] = l2.next(i);
- if ((l2.next(i) != l2.next(i + 3)) & (l2.next(i+1) != l2.next(i + 2)) ) {
- period++;
- }
- else break;
- System.out.println(i+") "+ l2.next(i));
- }
- String[] stringRandom = intArrayToStringArray(massRandInt, period);
- System.out.println("Период в битовом преставлении: ");
- printString(stringRandom, period);
- System.out.println("\n");
- //соединили в общую строку
- StringBuilder builder = concat(stringRandom);
- String str = builder.toString();
- System.out.println("Длина периода в битовом преставлении: " + builder.toString().length() + "\n");
- System.out.println("Количество нулей в одном периоде при битовом представлении\n" +
- "выходной последовательности: " + count_0(str) + "\n");
- System.out.println("Количество единиц в одном периоде при битовом представлении\n" +
- "выходной последовательности: " + count_1(str) + "\n");
- //сделали длину строки кратной 8 для работы с байтами
- String strMod_8 = Right_length(str, (str.length() + sizeOfBlock - (str.length() % 8)));
- //разбили массив нулей и единиц на лист, состоящий из байт
- List<String> sequenceOfBitChunks = bitsList(strMod_8);
- System.out.println("Количество четных чисел в одном периоде: " + getCountMod2(sequenceOfBitChunks) + "\n");
- System.out.println("Количество НЕчетных чисел в одном периоде: " + getCountNoMod2(sequenceOfBitChunks));
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement