【问题标题】:NOT(~) vs NEGATION(!)非(~)与否定(!)
【发布时间】:2012-07-19 07:22:11
【问题描述】:
#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)

我知道除了 0 之外的正负 i 的循环条件都是正确的。

while(!i) vs while(~i)

上面两个循环执行的'i'值是多少?

【问题讨论】:

  • 如果您不记得!~ 之间的区别,请使用!。它几乎总是你想要的。 ~ 很少需要。
  • 提示可能对您有用,因为正确答案已经发布。对于(模)整数类型,~i == -i - 1.
  • 运算符在 C++ 中确实有名称:!not~compl。 (小写,不是大写)
  • @MSalters 或在 C 中使用 iso646.h

标签: c++ c bitwise-operators logical-operators


【解决方案1】:

i 变为-1 时,~i 的值为~-10,因此while 循环停止执行。 ! 操作符之所以有效,是因为它做了一些完全不同的事情;它会导致 1 用于 0 值和 0 用于所有其他值。 ~ 是按位取反。

更详细一点:

  • ~ 获取数字中的每一位并切换它。因此,例如,100102 将变为 011012
  • 当二进制补码有符号整数时,-1 为二进制。
  • ~0b…111111110

但是:

  • !01!anythingElse0
  • -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 当 i = -1 时,~i = 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

      【讨论】:

        【解决方案4】:

        !是真/假逻辑翻转

        ! 表示any nonzero becomes 00 becomes 1

        例如1。 !0b1010 -&gt; 0b0000

        例如2。 !0b0000 -&gt; 0b0001

        例如 3。 !0b1111 -&gt; 0b0000

        概括,out = in?0:1

        当...

        ~ 有点翻转

        ~ 表示flip each and every bit

        例如1。 ~0b1010 -&gt; 0b0101

        例如2。 ~0b0000 -&gt; 0b1111

        例如 3。 ~0b1111 -&gt; 0b0000

        概括,out = in^0b1111

        【讨论】:

          猜你喜欢
          • 2012-08-02
          • 1970-01-01
          • 2014-08-30
          • 2017-09-28
          • 1970-01-01
          • 2018-05-10
          • 2014-11-24
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多