Есть целый ряд различных способов сделать это, но это сложно, чтобы предложить «лучшее» решение, не зная, почему просто использование битовой маски - проблема. Например, вы могли бы использовать вспомогательную функцию по линиям:
template< typename BITS> inline BITS set_bit(BITS data, size_t pos, bool val)
{
return (val) ? data | (1 << pos) : data & ~ (1 << pos);
}
unsigned int a = 128;
a = set_bit(a, 0, true);
std::cout << a << std::endl; // gives 129 = 10000001
a = set_bit(a, 4, true);
std::cout << a << std::endl; // gives 145 = 10010001
a = set_bit(a, 7, false);
std::cout << a << std::endl; // gives 17 = 00010001
(Обратите внимание, что я не добавил проверку границ этого от параметра pos
)
Другим способом сделать это может быть использовать битовое, который позволяет объявить имена переменных для отдельного бита и группы бит большего типа следующим образом:
struct MyBits {
unsigned int alpha : 1,
beta : 1,
gamma : 1;
};
MyBits b;
b.alpha = 1;
b.gamma = 1;
std::cout << b.alpha << std::endl; // gives 1
std::cout << b.beta << std::endl; // gives 0
std::cout << b.gamma << std::endl; // gives 1
третьего пути - хотя это не строго с использованиемкак таковой - может быть использование BitSet для достижения аналогичной работы:
#include <bitset>
std::bitset<8> c;
c[0] = true;
c[2] = true;
std::cout << c[0] << std::endl; // gives 1
std::cout << c[1] << std::endl; // gives 0
std::cout << c[2] << std::endl; // gives 1
Все они имеют свои преимущества и недостатки. Это во многом зависит от мотивационных факторов, стоящих за вашим вопросом.
Пожалуйста, покажите код. –
@MichaelWalz Я немного забил это в форму. – Magisch
Что случилось с 'y = a | mask'? Это уже очень коротко. –