Невозможно понять. Почему вывод "равен"
код:
if (-3 == ~2)
Console.WriteLine("equal");
else
Console.WriteLine("not equal");
выход:
equal
Невозможно понять. Почему вывод "равен"
код:
if (-3 == ~2)
Console.WriteLine("equal");
else
Console.WriteLine("not equal");
выход:
equal
Потому что двухкомбинированная бит-арифметика делает так
Cribbed со страницы wikipedia и расширена:
Most
Significant
Bit 6 5 4 3 2 1 0 Value
0 0 0 0 0 0 1 1 3
0 0 0 0 0 0 1 0 2
0 0 0 0 0 0 0 1 1
0 0 0 0 0 0 0 0 0
1 1 1 1 1 1 1 1 -1
1 1 1 1 1 1 1 0 -2
1 1 1 1 1 1 0 1 -3
1 1 1 1 1 1 0 0 -4
Итак, вы получаете:
0 0 0 0 0 0 1 0 = 2
1 1 1 1 1 1 0 1 = -3
В этой статье stackoverflow объясняется, почему:
Что такое тильда (~) в определении перечисления?
- унарный один оператор дополнения - он переворачивает биты своего операнда. в двух арифметических арифметиках, ~ x == -x-1
Это связано с двумя дополнительными представлениями целых чисел со знаком: http://en.wikipedia.org/wiki/Twos_complement
Потому что он использует два дополнения.
Существует большая разница между этими двумя операторами.
"Оператор ~ выполняет поразрядное операция дополнения на операнде, что приводит к немного. Операторы побитового дополнения предопределено для int, uint, long и ULONG".
Два дополнения 3:
1... 1101
Подписанное одно дополнение к 2 равно:
1... 1101
Это легко сделать:
Одно дополнение: Переверните биты. Два дополнения: одно дополнение + 1.
Почему это полезно? Компьютеры могут вычитать числа, просто перевернув и добавив бит.