Необходимо сделать программу реализующий этот алгоритм.
Алгоритм 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
заработал. Если можно еще оптимизировать, то подскажите как.
Вот на чем остановился:
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;
};
Виртуальный выделенный сервер (VDS) становится отличным выбором
Существует сервер, в котором запускается n-ое количество процессовСинхронизация происходит с помощью мьютекса
Пытался разобраться как добавить чекбоксы на представлениеНашел один вариант: ссылка Так приведен такой вариант решения
У меня есть слой, который заполняется виджетами
Подскажите пожалуйста - использую для ввода десятичного числа, почему-то по умолчанию выводит вместо точки запятую, хотя в обучалках показывает...