Оптимизировать алгоритм LSFR / MISR

105
09 декабря 2020, 02:00

Необходимо сделать программу реализующий этот алгоритм. Алгоритм done работает. Попробовал сделать оптимизацию (см функцию done2), но она работает не корректно.

#include <iostream>
#include <iomanip>
#include <bitset>
using namespace std;
const uint64_t INIT_VALUE = 0xFFFFFFFFFFFFFFFF;
const uint64_t POLYNOM = 0x0123456789ABCDF0;
template <uint SIZE>
class Misr {
public:
    Misr(uint64_t initValue, uint64_t poly) : m_initValue(initValue),
                                            m_poly(poly), m_prevMisr(initValue) {};
    void reset() { m_prevMisr = m_initValue; }
    uint64_t done(uint64_t in) {
        std::bitset<SIZE> inBits(in);
        std::bitset<SIZE> misr;
        // bit 0.
        {
            bool blockAnd = m_prevMisr.test(SIZE - 1) & m_poly.test(0);
            bool blockXor = inBits.test(0) ^ blockAnd;
            misr[0] = blockXor;
        }
        for (uint i = 1; i < SIZE; ++i) {
            bool blockAnd = m_prevMisr.test(SIZE - 1) & m_poly.test(i);
            bool blockXor = inBits.test(i) ^ blockAnd ^ m_prevMisr.test(i - 1);
            misr[i] = blockXor;
        }
        m_prevMisr = misr;
        return misr.to_ullong();
    }
    uint64_t done2(uint64_t in) { // не работает
        std::bitset<SIZE> misr = (m_prevMisr.test(SIZE - 1) ? m_poly : std::bitset<SIZE>(0)) ^ std::bitset<SIZE>(in) ^ (m_prevMisr << 1);
        misr[0] = (in & 1) ^ (m_prevMisr.test(SIZE - 1) & m_poly.test(0));
        m_prevMisr = misr;
        return misr.to_ullong();
    }
private:
    std::bitset<SIZE> m_initValue;
    std::bitset<SIZE> m_poly;
    std::bitset<SIZE> m_prevMisr;
};
int main()
{
    Misr<64> misr(INIT_VALUE, POLYNOM);
    for(uint8_t i = 0; i < 5; ++i) {
        auto t = misr.done(i + 1);
        cout.fill('0');
        cout.width(16);
        cout << hex << t << endl;
    }
    cout << endl;
    misr.reset();
    for(uint8_t i = 0; i < 5; ++i) {
        auto t = misr.done2(i + 1);
        cout.fill('0');
        cout.width(16);
        cout << hex << t << endl;
    }
}

UDP: done2 заработал. Если можно еще оптимизировать, то подскажите как.

Answer 1

Вот на чем остановился:

class Misr64 {
public:
    Misr64(uint64_t initValue, uint64_t poly) : m_initValue(initValue),
                                    m_poly(poly), m_prevMisr(initValue) {}
    void reset() { m_prevMisr = m_initValue; }
    inline uint64_t done(uint64_t in) {
        m_prevMisr = ((m_prevMisr >> 63 ? m_poly : 0) ^ in ^ (m_prevMisr << 1) & 0xFFFFFFFFFFFFFFFE)
                              | ((in & 1) ^ ((m_prevMisr >> 63) & (m_poly & 1)));
        return m_prevMisr;
    }
private:
    uint64_t m_initValue;
    uint64_t m_poly;
    uint64_t m_prevMisr;
};
READ ALSO
Как удалить все символы из stdin после получения доступа к серверу?

Как удалить все символы из stdin после получения доступа к серверу?

Существует сервер, в котором запускается n-ое количество процессовСинхронизация происходит с помощью мьютекса

101
Объясните, пожалуйста, часть кода на С++ (Qt)

Объясните, пожалуйста, часть кода на С++ (Qt)

Пытался разобраться как добавить чекбоксы на представлениеНашел один вариант: ссылка Так приведен такой вариант решения

117
Как удалить все виджеты со слоя (компоновщика) Qt

Как удалить все виджеты со слоя (компоновщика) Qt

У меня есть слой, который заполняется виджетами

97
в QInputDialog выводит запятую вместо точки для getDouble

в QInputDialog выводит запятую вместо точки для getDouble

Подскажите пожалуйста - использую для ввода десятичного числа, почему-то по умолчанию выводит вместо точки запятую, хотя в обучалках показывает...

107