НЕ (~) против НЕГАТИРОВАНИЯ (!)

#include <iostream>

using namespace std;
int main(int argc, char *argv[]) 
{
   int i=-5;
   while(~(i))
   {
      cout<<i;
      ++i;
   }

 }

Выход -5, -4, -3, -2. Не следует ли печатать значения до -1? Почему это только до -2. И, пожалуйста, объясните мне разницу между операторами "не" и "отрицанием". Когда я пишу программу, они были источником ошибок.

while(i)

Я знаю, что условие цикла будет истинным для положительного и отрицательного i, кроме 0.

while(!i) vs while(~i)

Для каких значений 'i' выполняются две указанные выше петли?

Ответы

Ответ 1

Когда i получает значение -1, значение ~i равно ~-1 или 0, поэтому цикл while прекращает выполнение. Оператор ! работает, потому что он делает что-то совершенно другое; это приводит к 1 для значений 0 и 0 для всех других значений. ~ - побитовое отрицание.

Немного подробнее:

  • ~ принимает каждый бит в числе и переключает его. Так, например, 10010 2 станет 01101 2
  • -1 - все единицы в двоичном формате, когда целое число с двумя дополнениями.
  • ~0b…11111111 0.

Однако:

  • !0 1, !anythingElse есть 0
  • -1 не 0
  • !-1 все еще 0

И если вы действительно хотите включить цикл, включая i == -1, просто используйте while (i) вместо while (~i).

Ответ 2

Вы правы в i == -1, являющемся условием выхода: ваш цикл эквивалентен

int i=-5;
while(i != -1)
{
    cout<<i;
    ++i;
}
// i == -1 immediately after the loop

При написании этого способа должно быть понятно, почему -1 не печатается, значение сначала печатается и только затем увеличивается, поэтому -2 - это последнее значение, которое вы печатаете.

Оператор !, с другой стороны, произведет 1 только тогда, когда ему будет дан ноль. Поэтому цикл будет печатать -1, когда оператор ! используется в условии цикла.

Ответ 3

'~' - это оператор: ~ x = -x-1 и при я = -1, то ~ я = 0. если вам интересно значение ~ i, вы можете просто распечатать их:

#include <iostream>

using namespace std;
int main(int argc, char *argv[]) 
{
   int i=-5;
   for (int i = -5; i <= 3; i++)
   {
    cout<<i<<"  "<<(~i)<<endl;
   }
 }

а затем вы найдете: -5 4 -4 3 -3 2 -2 1 -1 0 0 -1 1 -2 2 -3 3 -4