Побитовое НЕ (~)
В C++ оператор побитового отрицания обозначается тильдой ~. Этот оператор, в отличие от & и |, употребляется применительно к одному операнду, который указывается после ~. Побитовое НЕ меняет каждый бит операнда на противоположный: 0 становится 1, а 1 становится 0. Например:
0 1 operand1 ---------- 1 0 ~ operand1 int a = 103; // в двоичной системе: 0000000001100111 int b = ~a; // в двоичной системе: 1111111110011000 = -104
Вас может удивить, что результатом данной операции является отрицательное число -104. Это объясняется тем, что старший бит в переменной типа int является так называемым знаковым битом. Если старший бит 1, то число считается отрицательным. Такое представление положительных и отрицательных чисел принято называть дополнительным кодом. Более подробную информацию см. в статье Википедии "Дополнительный код".
Примечательно, что для любого целочисленного x, результатом операции ~x будет являться число (-x-1).
Таким образом, в выражениях со знаковыми целыми числами знаковый бит иногда может приводить к неожиданным, на первый взгляд, результатам.