Битовые операции позволяют манипулировать отдельными битами чисел. Они широко используются в низкоуровневом программировании, оптимизациях и работе с аппаратурой.
unsigned int a = 0b1100; // 12
unsigned int b = 0b1010; // 10
unsigned int result = a & b; // 0b1000 (8)
Применение:
unsigned int a = 0b1100;
unsigned int b = 0b1010;
unsigned int result = a | b; // 0b1110 (14)
Применение:
unsigned int a = 0b1100;
unsigned int b = 0b1010;
unsigned int result = a ^ b; // 0b0110 (6)
Свойства:
a ^ a = 0
a ^ 0 = a
unsigned int a = 0b1100;
unsigned int result = ```a; // 0b...11110011 (инверсия всех битов)
Особенность: Результат зависит от размера типа
unsigned int a = 0b0001;
unsigned int result = a << 3; // 0b1000 (8)
Эквивалентно: Умножению на 2^n (если нет переполнения)
unsigned int a = 0b1000;
unsigned int result = a >> 3; // 0b0001 (1)
Эквивалентно: Целочисленному делению на 2^n
unsigned int setBit(unsigned int num, int pos) {
return num | (1 << pos);
}
unsigned int clearBit(unsigned int num, int pos) {
return num & ```(1 << pos);
}
bool isBitSet(unsigned int num, int pos) {
return num & (1 << pos);
}
unsigned int toggleBit(unsigned int num, int pos) {
return num ^ (1 << pos);
}
int fastMultiply(int x, int power) {
return x << power; // x * 2^power
}
int fastDivide(int x, int power) {
return x >> power; // x / 2^power
}
bool isEven(int x) {
return (x & 1) == 0;
}
void swap(int &a, int &b) {
a ^= b;
b ^= a;
a ^= b;
}
int lowestSetBit(int x) {
return x & -x;
}
Знаковые vs беззнаковые сдвиги
>>
) зависит от реализацииОпасности:
Порядок операций:
struct Flags {
unsigned int isReady : 1;
unsigned int hasError : 1;
};
std::bitset<8> bits(0b10101010);
bits.set(3); // Установить бит
bits.test(2); // Проверить бит
Резюмируем: битовые операции - мощный инструмент для эффективной работы с данными на уровне битов. Они незаменимы в системном программировании, оптимизациях и алгоритмах, работающих с битовыми масками. Однако требуют аккуратного использования и понимания их поведения с разными типами данных.