Evgenii
проще помочь будет
Александр
Окей. Хочу попробовать реализацию генетического алгоритма, манипулируя исключительно битами, не смотря на структуру хранения. Хрень выйдет или нет
Andrei
Мне кажется это типичный пример http://xyproblem.info/
Aidar
И оператор сравнения
Александр
Юнион с массивом
Юнион - опять же нужно писать манипуляторы с битами
Aidar
И что
Александр
Я в курсе про XY, но знаю, чего хочу)
Evgenii
напиши функции делающие эти операции
Andrei
Зачем? Меня что-нибудь слышит?
Andrei
пусть конструирует bitset!!!!
Andrei
У него есть конструктор.
Aidar
Пусть конструирует битсет
Александр
Зачем? Меня что-нибудь слышит?
Я слышу. А из double? Из std::array<std::array<double, 5>, 5>?
Evgenii
пусть конструирует bitset!!!!
изменить и назад? 🤔
Andrei
Если тебе известен размер, битсета, делаешь reinterpret_cast
Andrei
И по 8 байт сдвигая копируешь
Andrei
Получаешь свой замечательный битсет.
Александр
Отнаследоваться от битсета и добавить конструкторов?)
Evgenii
Отнаследоваться от битсета и добавить конструкторов?)
я б написал функции которые работают с масками
Andrei
я б написал функции которые работают с масками
Он хочет STL-интерфейс битсета и не думать больше ни о чём.
Александр
Писать сериализацию для всех 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
> почему нельзя reinterpret_cast? Потому, что alignment у short не равен alignment у long long. В итоге на x86 вы получите адовую просадку произаодительности, т.к. будете выполнять инструкцию над неверно выровненными данными. На ARM же ваше приложение просто упадёт.
Александр
А BitRepresentation это что?
Это мой класс из uint8_t[sizeof(T) * 8] и std::bitset<sizeof(T)*8>& Bits() { ... }
Evgenii
template<typename T> flip_bit (uint_fast8_t bit_num, T data) { return (T) ((uint_fast64_t)data ^ (1ull << bit_num)); }
Александр
memcpy в unsigned long long l; return std::bitset{l};
Не решает проблему с std::array<std::array<....>>
Александр
template<typename T> flip_bit (uint_fast8_t bit_num, T data) { return (T) ((uint_fast64_t)data ^ (1ull << bit_num)); }
Опять же. Зачем изобретать велосипед? Я с масками умею работать. Но bitset лучше
Berkus
Это мой класс из uint8_t[sizeof(T) * 8] и std::bitset<sizeof(T)*8>& Bits() { ... }
у тебя operator == неправильно имплементирован похоже
Александр
Почему нет?
Не влезет в unsigned long long?)
Александр
у тебя operator == неправильно имплементирован похоже
Там сравниваются битсеты полученные. У них-то он правильно имплементирован
Berkus
нет, битсет конструируется с фиксированным размером в битах
Berkus
от 1 лонга до N
Andrei
Не влезет в unsigned long long?)
Не влезет, да, Evgeniy выше предлагал написать шаблонную магию, которая сконструирует битсет правильного размера.
Александр
Вы все отвечаете не на тот вопрос. Я знаю способы, как это реализовать. Мне интересно, почему конкретно этот способ даёт такое странное поведение
Berkus
шаблонная магия наверное называется boost::dynamic_bitset
Berkus
покажи свой BitRepresentation то уже
Александр
https://hastebin.com/ohahoyaqik.cpp
Александр
ЖЕСТЬ
Спасибо, я старался
Evgenii
Опять же. Зачем изобретать велосипед? Я с масками умею работать. Но bitset лучше
потому что я написал 3 строки, за минуту на телефоне, а ты код сколько дебажишь?
Andrei
Зачем перевыделять да еще и динамически память?
Александр
Зачем перевыделять да еще и динамически память?
Динамика - потому что move на указатель быстрее, чем копирование данные
Александр
потому что я написал 3 строки, за минуту на телефоне, а ты код сколько дебажишь?
Я работаю с кодом не для того, чтобы быстро написать пару костылей, а чтобы разобраться и сделать выводы на будущее
Andrei
Динамика - потому что move на указатель быстрее, чем копирование данные
Или у меня с глазами проблема или у тебя там и так memcpy
Andrei
Храни ты в этой структуре СРАЗУ bitset нужного размера.
Александр
Или у меня с глазами проблема или у тебя там и так memcpy
memcpy для копирования. Для мува там свап указателей
Александр
template<typename T> flip_bit (uint_fast8_t bit_num, T data) { return (T) ((uint_fast64_t)data ^ (1ull << bit_num)); }
Для всех типов, у которых размер не больше 8 байт, ага
Berkus
проблема которую я вижу в том что bitset<N> это набор из N/8 лонг лонгов
Berkus
(или N/4 интов или еще любая поебень)
Berkus
когда ты кусок памяти так интерпретируешь то intel endianness превратит твой тип в фарш
Александр
ты сказал POD и array-of-PODs, нет?
Да. std::array<double, 5> как влезет в 8 байт?
Evgenii
Да. std::array<double, 5> как влезет в 8 байт?
ну сверху обертка еще три строки чтобы выбрать нужный элемент
Александр
ну вот вывод на будущее: у тебя UB, у меня работает)
Я буду знать, какие тонкости могут возникнуть при реализации всяких variant, как вообще reinterpret_cast может выстрелить, и что говорить компилятору, чтобы всё было ок
Александр
ну сверху обертка еще три строки чтобы выбрать нужный элемент
http://ru.cppreference.com/w/cpp/utility/bitset ну и еще немного методов
Andrei
Хотя ощущение такое, что и правда легче написать обёртку, которая держит референс на объект и даёт интерфейс к битам
Evgenii
http://ru.cppreference.com/w/cpp/utility/bitset ну и еще немного методов
тебе нужны они все, включая to_string? Формулируй яснее тогда
Evgenii
потому что я понял что нужные операции с битами, т.е. set, reset, flip
Александр
тебе нужны они все, включая to_string? Формулируй яснее тогда
Я сразу сформулировал. Мне нужна обертка для работа с битами
Александр
to_string - конечно. Для отладки не помешает