Этот оператор является унарным и только префиксным, он инвертирует (изменяет) все разряды (биты) своего операнда. Единицы становятся нулями, а нуля — единицами. Положительные числа становятся отрицательными, а отрицательные становятся положительными. При этом инвертируемое значение уменьшается на 1. Поэтому, что бы получить точную копию числа с обратным знаком, еще нужно прибавить 1.
x |
~x |
0 |
1 |
1 |
0 |
Значение 3 в 32 разрядном компьютере в двоичном счислении:
0000 0000 0000 0000 0000 0000 0000 0011
оператор НЕ (~) меняет все биты на противоположные, это число -4
1111 1111 1111 1111 1111 1111 1111 1100
прибавляем единицу
0000 0000 0000 0000 0000 0000 0000 0001
получаем число 3 с обратным знаком
1111 1111 1111 1111 1111 1111 1111 1101
0000 0000 0000 0000 0000 0000 0000 0011
оператор НЕ (~) меняет все биты на противоположные, это число -4
1111 1111 1111 1111 1111 1111 1111 1100
прибавляем единицу
0000 0000 0000 0000 0000 0000 0000 0001
получаем число 3 с обратным знаком
1111 1111 1111 1111 1111 1111 1111 1101
Main.cs
usingSystem;classProgram {-
publicstaticintMain() { -
intval = 3; -
Console.WriteLine(~val); -
//нужно добавить единицу, что бы получить точную копию числа с обратным знаком -
Console.WriteLine(~val + 1); -
Console.ReadKey(); -
return0; -
} }
usingSystem;classProgram {-
publicstaticintMain() { -
intval = 3; -
Console.WriteLine(~val); -
//нужно добавить единицу, что бы получить точную копию числа с обратным знаком -
Console.WriteLine(~val + 1); -
Console.ReadKey(); -
return0; -
} }
-4
-3
-3