编程语言
首页 > 编程语言> > C++卡常之i++ ——> i=-~i

C++卡常之i++ ——> i=-~i

作者:互联网

前置知识:

原码表示法是整数的一种简单的表示法,符号位用0表示正号,用1表示负号,数值一般用二进制形式表示。
整数的反码可由原码得到,如果是正数,则反码与原码一样;如果是负数,则反码是对它的原码(符号位除外)各位取反而得到的。
整数的补码可由原码得到。如果是正数,则补码与原码一样;如果是负数,则补码是在反码基础上,末位加1而得到。

(关于补码的知识,详见这里

~ 取反 (把运算数的各个二进制按位求反)

 

e.g.

1. ~9

原码:   0000 1001

(这里最左位的0表示正,如果是1就表示负,其余位按二进制表示)

反码:  0000 1001

(正数的反码等于它的原码)

补码:  0000 1001

(正数的补码等于它的原码)

按位取反:1111 0110

(这时得到的是取反后的补码,我们要把它转化成原码)

(因为第一位是1,所以这是负数,要按照负数的转换法则倒退回去)

(负数的反码+1=补码,因此负数的反码=补码-1)

反码:  1111 0101

(负数的原码按位取反(符号位除外)即为反码,因此负数的反码按位取反(符号位除外)就可转换为原码

原码:  1000 1010

转换为十进制,即为:  -10

 

2. ~-9

原码:  1000 1001

(最左位是1表示是负数)

反码:  1111 0110

(负数的原码转换为反码,符号位不变,其余位按位取反)

补码:  1111 0111

(负数的反码转换为补码,加1即可)

按位取反:0000 1000

(按位取反后为正数,因为正数的补码等于原码,所以直接转十进制即可)

转十进制,即为:  8

 

 

 

这时可以进入正题了。

 

1 for(int i=1;i<=n;i++)

 

这应该算写的最多的代码之一了,殊不知它还可以进行卡常优化。

 

for(int i=1;i<=n;i=-~i)

 

i=-~i等价于i++,但要比i++快上很多。

什么原理呢?

原理就是......

 

(何大佬中途插入:++i更快!)

(我:那算了,还是不写了。。。)

 

(未完)

 

标签:反码,++,补码,取反,C++,负数,按位,卡常,原码
来源: https://www.cnblogs.com/void-null/p/15158676.html