Использовать std::bitset или базовый тип того же размера?

Я создаю шахматный решатель и решил использовать битовые доски. Удобно, что на стандартной шахматной доске 64 клетки. Это хорошо, поскольку в 64-битных операционных системах одна битовая плата может поместиться в один регистр.

Тем не менее, есть ли принципиальные различия (размер (память и код), скорость, сложность, использование памяти и т. д.) в использовании std::bitset<64> и функций в нем или фундаментальный тип «того же» размера unsigned long long и выполнение битового переворачивания вручную?


person Casey    schedule 08.08.2015    source источник


Ответы (1)


uint64_t возможно. Вы захотите выполнять операции, которые недоступны на std::bitset, включая почти все арифметические операции, битовое сканирование, использование частей платы в качестве индекса в массиве и встроенные функции SSE, если вы серьезно относитесь к этому.

Например (ни в коем случае не исчерпывающий список, просто несколько простых примеров) в o^(o-2r) (и его двоюродный брат), более продвинутая квинтэссенция Hyperbola, как часть извлечения самого младшего установленного бита и т. д.

Вы можете использовать std::bitset, но вы будете часто преобразовывать его обратно в какой-то тип целого числа.

person harold    schedule 08.08.2015
comment
Вы делаете несколько хороших замечаний. Хотя, по крайней мере, в Visual Studio uint64_t является определением типа для unsigned long long, поэтому при использовании uint64_t, хотя удобочитаемость и понимание для читателя увеличиваются, это не имеет значения для компилятора или ЦП. - person Casey; 09.08.2015
comment
Типы с фиксированной шириной буквально предназначены для удобочитаемости и понимания... не говоря уже о том, что вы точно знаете, с чем имеете дело. Почему вы выбрали unsigned long long вместо uint64_t, когда вам нужен 64-битный тип? - person Lightness Races in Orbit; 09.08.2015