~和-这两个运算符看起来是那么相似,感觉是一种互逆的运算符(比如一元+和医院-,取地址&和解引用*...)
但是,如果你认为它们是相等的,那就不一定是正确的,先请看下面这一段例子.
- #include <iostream>
- int main()
- {
- std::cout << -3 << std::endl;
- std::cout << ~3 << std::endl;
- std::cout << -~3 << std::endl;
- std::cout << ~-~3 << std::endl;
- std::cout << -~-3 << std::endl;
- std::cout << ~-~-3 << std::endl;
- std::cout << -~-~3 << std::endl;
- std::cout << ~-~-~3 << std::endl;
- std::cout << -~-~-3 << std::endl;
- return 0;
- }
如果请您写出这段代码的结果,你能保证完全正确吗?
如果不能保证完全正确,那就请继续讲本文看下去.
一开始我们先进入那二进制世界来讨论,首先取负运算符是按照计算机中补码的原理进行求反,所以不管怎么变,它的绝对值都不变.
但是按位取反运算符就不一样了,它并不会像取负运算符那样是按照补码原理进行求反的,它直接就是一个一个位进行01互换,而没有补码中的01互换后还要在末尾加1.弄清楚这一点非常重要,这对我们例子中的结果有极大的关系.
回到我们的例子中来.
它的运行结果如下:
- -3
- -4
- 4
- -5
- -2
- 1
- 5
- -6
- -1
内容已经讲完了,下面再给几道练习题
- // 下面是练习题
- ~~~~-~~-~5;
- -~---~~~-~~19;
- ~--~~~-~--~2;
- ~~~--~~---4;
- --~--~--~--~14;
- ---~---~----~~~32;
请如果要做题的同学们请自己算,如果借助编译器,则不能达到提升的效果.