Evgenii
проще помочь будет
Александр
Окей. Хочу попробовать реализацию генетического алгоритма, манипулируя исключительно битами, не смотря на структуру хранения. Хрень выйдет или нет
Andrei
Мне кажется это типичный пример http://xyproblem.info/
Aidar
Aidar
И оператор сравнения
Andrei
Evgenii
Aidar
И что
Александр
Я в курсе про XY, но знаю, чего хочу)
Evgenii
Evgenii
напиши функции делающие эти операции
Andrei
Зачем? Меня что-нибудь слышит?
Andrei
пусть конструирует bitset!!!!
Andrei
У него есть конструктор.
Aidar
Пусть конструирует битсет
Evgenii
Andrei
Если тебе известен размер, битсета, делаешь reinterpret_cast
Andrei
И по 8 байт сдвигая копируешь
Andrei
Получаешь свой замечательный битсет.
Aidar
Александр
Отнаследоваться от битсета и добавить конструкторов?)
Evgenii
Evgenii
Александр
Писать сериализацию для всех pod-типов? Нет уж, спасибо
Александр
Не сработает, да и сишный каст почти такой же
Aidar
Чозадичь
Aidar
Реинтерпрет каст в битсет
Aidar
Ну е
Александр
Вообще, знаете о чем был изначальный вопрос?)
Aidar
Ну ё... Так лучше?
Evgenii
я б затемплейтил функции которые кастят к uint64_t и применяют bitwise operations
Andrei
Если хочется еще и аккуратно и по-взрослому, то можно использовать std::aligned_storage и прочие c++11 штуки для работы с выравниванием, чтобы получать детерминированный layout своих объектов.
Александр
А вопрос был следующий. Почему данный код: https://hastebin.com/juzuxulice.cpp
Даёт следующий результат: https://hastebin.com/awicijobag.cpp
Точнее не "почему?", а "как исправить этот UB?".
Andrei
А BitRepresentation это что?
🐙 Antony
🐙 Antony
> почему нельзя reinterpret_cast?
Потому, что alignment у short не равен alignment у long long. В итоге на x86 вы получите адовую просадку произаодительности, т.к. будете выполнять инструкцию над неверно выровненными данными. На ARM же ваше приложение просто упадёт.
Evgenii
template<typename T>
flip_bit (uint_fast8_t bit_num, T data) {
return (T) ((uint_fast64_t)data ^ (1ull << bit_num));
}
Александр
Andrei
Berkus
Berkus
нет, битсет конструируется с фиксированным размером в битах
Berkus
от 1 лонга до N
Александр
Вы все отвечаете не на тот вопрос. Я знаю способы, как это реализовать. Мне интересно, почему конкретно этот способ даёт такое странное поведение
Berkus
шаблонная магия наверное называется boost::dynamic_bitset
Berkus
покажи свой BitRepresentation то уже
Александр
https://hastebin.com/ohahoyaqik.cpp
Andrei
Александр
ЖЕСТЬ
Спасибо, я старался
Evgenii
Andrei
Зачем перевыделять да еще и динамически память?
Andrei
Andrei
Храни ты в этой структуре СРАЗУ bitset нужного размера.
Evgenii
Александр
Александр
Berkus
проблема которую я вижу в том что bitset<N> это набор из N/8 лонг лонгов
Berkus
(или N/4 интов или еще любая поебень)
Berkus
когда ты кусок памяти так интерпретируешь то intel endianness превратит твой тип в фарш
Evgenii
Andrei
Andrei
Хотя ощущение такое, что и правда легче написать обёртку, которая держит референс на объект и даёт интерфейс к битам
Evgenii
Evgenii
потому что я понял что нужные операции с битами, т.е. set, reset, flip
Александр
to_string - конечно. Для отладки не помешает