Как мне перемешать биты в структуре?

У меня есть пара pack/unpack функции, которые оперируют структурой данных.

Чтобы эффективно их тестировать,
Я хотел бы поместить эту структуру в случайное состояние, а затем убедиться, что упаковка и распаковка возвращают исходную структуру. Это может выглядеть примерно так:

for (int i = 0; i < LOTS_OF_TESTS; ++i){
Struct s;
randomize_bits(s);
CHECK ( s == UnPack(Pack(s)) );
}

Есть ли функция, которая принимает универсальный тип и рандомизирует все биты?

условия:
— В структуре нет указателей
— Там могут быть фундаментальные типы
— Там могут быть вложенные структуры
— Там могут быть массивы
— Я не беспокоюсь о набивке


Я думал, что смогу использовать что-то с MemSet,
покупка моя попытка дает мне исключение времени выполнения.

template<typename T>
void randomize_bits(T & t){
for (size_t i = 0; i < sizeof(t); ++i){
std::memset((&t)+i,random_uchar(),1);
}
}

2

Решение

Как предположил Базиль, это решает мою проблему и правильно перебирает память.

template<typename T>
void randomize_bits(T & t){
for (size_t i = 0; i < sizeof(t); ++i){
reinterpret_cast<unsigned char*>(&t)[i] = random_uchar();
}
}
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]