~ Действительно ли я эквивалентен i! = -1? - PullRequest
7 голосов
/ 26 июня 2019

Как ~i работает в C ++?

Я только что заметил, что это эквивалентно i != -1, но я не уверен в этом.

int arr[3] {1, 2, 3};
int n = 3;
for (int i = n - 1; ~i; i--) {
    cout << arr[i] << ' ';
}

Он печатал массив в обратном порядке.

Ответы [ 3 ]

14 голосов
/ 26 июня 2019

~ - побитовый оператор НЕ. ~i равно 0 тогда и только тогда, когда i имеет 1 во всех битах. Имеет ли -1 все биты 1, зависит от того, как числа со знаком представлены в системе. В представлении дополнения до двух -1 представлен со всеми битами 1, поэтому в таких системах ~(-1) == 0. Ни в дополнении, ни в знаке и величине это не выполняется.

Следовательно, ответ - нет; не на всех системах. Тем не менее, два дополнения довольно распространены в современных машинах (все сделано с 90-х годов), и на таких системах ответ - да. Независимо от представления знака, однако, i != -1 гораздо более читабелен.

5 голосов
/ 26 июня 2019

~i - побитовый оператор НЕ.Т.е. он инвертирует каждый бит в i.-1 представляется двоичным, так как каждый бит числа устанавливается в 1, инвертируя каждый бит в 0, вы получаете 0. И при проверке целого числа на месте, где ожидается bool, 0 обрабатывается как false, а любое другое число как true.

Итак, в данном конкретном случае да, ~i эквивалентно i != -1.

0 голосов
/ 26 июня 2019

Поскольку ваша переменная i из цикла for имеет тип int, который определяется как целое число со знаком и, таким образом, в дополнении к двойкам, его двоичное представление значения -1 является набором всех битов, что означает, что все биты равны 1. На другом сторона, побитовое отрицание всех единиц - это все нули, и это то, что вам нужно, цикл выполнять до тех пор, пока i> = 0 или i! = - 1, поскольку вы уменьшаете i. В этом контексте побитовые операции со знаковыми значениями в системе дополняют двоичное представление типа int, да, это то же самое.

...