Какова функция побитового оператора ~ (тильда)

Возможный дубликат:
Что означает здесь этот оператор ~ ?
Бит не работает в PHP ( или, возможно, на любом другом языке)

Может кто-нибудь объяснить мне оператор ~ в PHP? Я знаю, что это НЕ-оператор, но почему PHP конвертирует следующий оператор к отрицательному значению переменной минус один?

$a = 1; echo ~$a    // echo -2
$a = 2; echo ~$a    // echo -3
$a = 3; echo ~$a    // echo -4  

person Michiel    schedule 03.02.2012    source источник
comment
Информация об этом доступна во всем Интернете   -  person Lightness Races in Orbit    schedule 03.02.2012
comment
В дубликате нет ничего, связанного с арифметикой дополнения до двух, что и составляет суть этого вопроса. Я сомневаюсь, что это точный дубликат. Однако этот этот вопрос касается точно такой же проблемы.   -  person buc    schedule 03.02.2012


Ответы (3)


Это называется арифметикой дополнения до двух. Вы можете прочитать об этом более подробно здесь.

Оператор ~ является оператором двоичного отрицания (в отличие от логического отрицания), и поэтому он инвертирует все биты своего операнда. Результатом является отрицательное число в арифметике с дополнением до двух.

person buc    schedule 03.02.2012
comment
Хотя это правда, что двоичное представление результата числа, которому предшествует ~, находится в дополнении до двух, я считаю, что арифметика с дополнением до двух в некоторой степени вводит в заблуждение. Поразрядное НЕ точнее ИМО. - person Rain; 09.04.2021

Это побитовое НЕ.

Он преобразует все единицы в нули и все нули в единицы. Таким образом, 1 становится -2 (0b111111111110 в двоичном представлении).

Взгляните на документ http://php.net/manual/en/language.operators.bitwise.php

person akond    schedule 03.02.2012
comment
-2 действительно. Только что проверил. - person akond; 04.02.2012
comment
Это правда. Это побитовое НЕ, но представление чисел со знаком позволяет отображать, например,. -2. Но если вы посмотрите на двоичный уровень, вы увидите, что это полное отрицание. - person Seyfi; 01.08.2016

~ переворачивает все биты числа. В дополнении до двух (погуглите) математическое отрицание можно получить, перевернув все биты, а затем добавив 1. Если вы выполните только первый шаг (то есть просто переверните биты), у вас будет аддитивная инверсия минус 1.

person cHao    schedule 03.02.2012