首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NOT(~) vs NEGATION(!)

NOT(~) vs NEGATION(!)
EN

Stack Overflow用户
提问于 2012-07-20 10:53:07
回答 3查看 86.9K关注 0票数 28
代码语言:javascript
复制
#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’operators.When之间的区别,不管我写什么程序,它们都是bug的源头。

代码语言:javascript
复制
while(i)

我知道循环条件对于除0以外的正和负i都为真。

代码语言:javascript
复制
while(!i) vs while(~i)

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

EN

回答 3

Stack Overflow用户

发布于 2012-07-20 10:58:20

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

代码语言:javascript
复制
int i=-5;
while(i != -1)
{
    cout<<i;
    ++i;
}
// i == -1 immediately after the loop

当以这种方式编写时,应该很清楚为什么不打印-1首先打印值,然后才递增,这就是为什么-2是您打印的最后一个值。

另一方面,!运算符仅在被赋予零值时才会生成1。这就是为什么在循环条件中使用!运算符时,循环会打印-1

票数 5
EN

Stack Overflow用户

发布于 2012-07-20 11:22:55

'~‘是这样的运算符:~x = -x -1,当i=-1时,则~i = 0。如果你想知道~i的值,你可以把它们打印出来:

代码语言:javascript
复制
#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
EN

Stack Overflow用户

发布于 2020-04-07 05:58:34

!为真/假逻辑翻转

!表示any nonzero becomes 00 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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11572181

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档