Для начала необходимо рассказать о формате представления чисел в компьютере.
Мы в нашей жизни привыкли к десятичному представлению чисел: 56, 777, 10957 и т.д. Десятичное представление числа 10957 означает, что 10957 = 1×104 +0×103+9×102+5×101+7×100. Иными словами десятичное число — это a0*100+a1*101+a2*102+ +an*10n. Т.е. сумма произведений соответствующей цифры (ai) на соответствующую степень числа 10 (10i).
В компьютере внутренний формат представления чисел — двоичный. В двоичном формате все числа состоят из нулей и единиц, а в качестве множителя используется не число 10, возведенное в степень, а соответствующая степень числа 2. Например, двоичное число 10001101 равно десятичному (обычному) числу 1×27+0×26+0×25+0×24+1×23+1×22+0×21+1×20 = 128+0+0+0+8+4+0+1 = 141.
Каждая такая двоичная цифра (1 или 0) называется битом.
Теперь мы знаем достаточно, чтобы рассмотрить побитовые операции.
Побитовые операции
Дополнение до единицы. В каждом разряде единица заменяется нулем, а нуль — единицей. Пример:
int b = 141; // начальное значение переменной b равно 141,
// что в двоичном представлении равно 10001101
b = ~b; // переменная b стала равна 01110010, т.е. 114
Сдвиг вправо. Двоичное представление первого операнда сдвигается вправо на количество разрядов, равное значению второго операнда. Освобождающиеся «левые» разряды будут заполняться нулями. Пример:
int b = 141; // начальное значение переменной b равно 141,
// что в двоичном представлении равно 10001101
b = b >> 2; // переменная b стала равна 00100011, т.е. 67
Сдвиг влево. Двоичное представление первого операнда сдвигается влево на количество разрядов, равное значению второго операнда. Появившиеся «правые» разряды будут заполняться нулями. Пример:
int b = 141; // начальное значение переменной b равно 141,
// что в двоичном представлении равно 10001101
b = b << 2; // переменная b стала равна 1000110100, т.е. 564
Побитовая операция И. Результат будет содержать единицу в тех разрядах, где соответствующие разряды первого и второго операнда содержат единицу. В других случаях соответствующий бит результата будет равен 0. Пример:
int a = 25; // начальное значение переменной a равно 25,
// что в двоичном представлении равно 00011001
int b = 141; // начальное значение переменной b равно 141,
// что в двоичном представлении равно 10001101
a = a & b; // переменная a стала равна 00001001, т.е. 9
Побитовая операция ИЛИ. Результат будет содержать ноль в тех разрядах, где соответствующие разряды первого и второго операнда содержат ноль. В других случаях соответствующий бит результата будет равен 1. Пример:
int a = 25; // начальное значение переменной a равно 25,
// что в двоичном представлении равно 00011001
int b = 141; // начальное значение переменной b равно 141,
// что в двоичном представлении равно 10001101
a = a | b; // переменная a стала равна 10011101, т.е. 157
Побитовая операция исключающее ИЛИ. Значение результирующего выражения будет содержать 1 в тех разрядах, в которых x и y имеют разные двоичные значения, и 0 — во всех остальных разрядах. Пример:
int a = 25; // начальное значение переменной a равно 25,
// что в двоичном представлении равно 00011001
int b = 141; // начальное значение переменной b равно 141,
// что в двоичном представлении равно 10001101
a = a ^ b; // переменная a стала равна 10010100, т.е. 148