NOT(~)与NEGATION(!)的区别

32
#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”操作符的区别。每当我编写程序时,它们往往是错误的根源。
while(i)

我知道循环条件对于正数和负数i值是真的,除了0。

while(!i) vs while(~i)

上述两个循环中,'i' 的取值范围是多少?


如果你记不住 !~ 之间的区别,就使用 !。它几乎总是你想要的那个。~ 很少是必需的。 - user149341
3
这可能对你有用的提示,因为正确的答案已经发布了。对于(模块化)整数类型,~i == -i - 1 - Ray Toal
5
在C++中,操作符其实是有名字的:!not~compl。(小写字母,不是大写字母) - MSalters
@MSalters 或者在 C 中使用 iso646.h - endolith
4个回答

51

i 变成 -1 时,~i 的值为 ~-1, 或者说是 0,因此 while 循环停止执行。而 ! 运算符的作用则完全不同:它对于0值返回 1,对于其他所有值返回 0。而 ~ 是按位取反运算符。

更详细地说:

  • ~ 操作将数字中的每一位进行取反操作。例如,100102 将变成 011012
  • 当使用二进制补码表示有符号整数时,-1 对应着二进制中所有位均为 1。
  • ~0b…11111111 的结果为 0

但需要注意:

  • !0 的结果为 1,对于其他非零值则返回 0
  • -1 不等于 0
  • !-1 的结果仍然是 0

如果您希望在循环中包括 i == -1 的情况,则可以使用 while (i) 代替 while (~i)


5

您关于i == -1是退出条件的说法是正确的:您的循环与以下代码等效

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

这样写就清楚了,为什么在打印值之后才把它增加,这就是为什么你打印的最后一个值是-2而不是-1

另一方面,!操作符只有在给定零时才会产生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


这是一组数字,按照行列排列。

2

! 是真/假逻辑翻转

! 表示 任何非零变成00变成1

例如1. !0b1010 -> 0b0000

例如2. !0b0000 -> 0b0001

例如3. !0b1111 -> 0b0000

通常,out = in?0:1

而...

~ 是位翻转

~ 表示翻转每一个位

例如1. ~0b1010 -> 0b0101

例如2. ~0b0000 -> 0b1111

例如3. ~0b1111 -> 0b0000

通常,out = in^0b1111


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接