NOT(〜)vs NEGATION(!)

时间:2012-07-20 02:53:07

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

#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。 请解释一下'not'和'negation'运算符之间的区别。当我编写程序时,它们就是bug的来源。

while(i)

我知道循环条件对于正负i是正确的,除了0。

while(!i) vs while(~i)

对于'i'的上述两个循环的执行值是什么?

4 个答案:

答案 0 :(得分:36)

i到达-1时,~i的值为~-10,因此while循环停止执行。 !运算符的工作原理是因为它完全不同;对1值产生0,对所有其他值产生0~是一个按位否定。

更详细一点:

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

然而:

  • !01!anythingElse0
  • -1不是0
  • !-1仍然是0

如果你真的想要循环包括i == -1,只需使用while (i)代替while (~i)

答案 1 :(得分:5)

关于i == -1退出条件是正确的:你的循环等同于

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

以这种方式编写时,应该清楚为什么-1没有打印首先打印的值,然后才增加,这就是为什么-2是你打印的最后一个值。

另一方面,!运算符只有在给定零时才会生成1。这就是在循环条件中使用-1运算符时循环将打印!的原因。

答案 2 :(得分:2)

&#39;〜&#39;操作符是:~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

答案 3 :(得分:0)

!是对/错逻辑翻转

!的意思是any nonzero becomes 0,而0 becomes 1

eg1。 !0b1010 -> 0b0000

eg2。 !0b0000 -> 0b0001

eg3。 !0b1111 -> 0b0000

通用,out = in?0:1

同时...

~有点翻转

~的意思是flip each and every bit

eg1。 ~0b1010 -> 0b0101

eg2。 ~0b0000 -> 0b1111

eg3。 ~0b1111 -> 0b0000

通用,out = in^0b1111