Я полагаю, что ваше понимание набора битов элементарно неверно: set означает, что он НЕ упорядочен, и идея набора битов состоит в том, что для показа того, что элемент находится внутри / вне набора, необходим только один бит.Таким образом, ваш исходный набор 0,2,7
будет иметь 8 битов, потому что 0..7 - это 8 элементов, а НЕ 3 * 3 (3 бита, необходимых для представления 0..7), а растровое изображение будет выглядеть как 10000101
.То, что вы описываете, это просто «упакованная» кодировка значений.В вашей схеме кодирования 0,2,7 и 2,0,7 будут закодированы совершенно по-разному, но в битовом наборе они одинаковы.
В (реальном) битовом наборе (если это то, что вы хотите) выЗатем можно действительно легко «заменить» элементы, удалив старые и добавив новые.Это происходит так, как описывает TED.
Чтобы получить правильную маску, вы можете легко использовать операции сдвига.Итак, представьте, что вы начинаете считать с 0, вы получаете маску для значения x, выполняя: 1<<x
;
Таким образом, вы удаляете элемент x из набора с помощью
value &= ~(1<<x);
и добавляете еще один элементx (который может быть таким же) с
value | = 1<<x;
Из вашего комментария вы неправильно используете набор битов, поэтому маски должны быть построены по-другому (и у вас уже была почти правильная идея, как их создавать).
Команда с битовой маской для удаления элемента в позиции p:
value &= ~(111 p);
Это 111 для приведенного выше примера, где вам нужно 3 бита для позиции.Если вы не хотите жестко его кодировать, вы можете просто взять следующую степень 2 и вычесть 1, а затем вы получите свою единственную 1-строковую строку.
И для добавления вы просто возьмете свой самый подходящий битлист, содержащийтолько новый элемент и ИЛИ его в ваш список битов:
value |= new_element_bitlist;