ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2021-08-18 20:31:28  阅读:241  来源: 互联网

标签:反码 ++ 补码 取反 C++ 负数 按位 卡常 原码


前置知识:

原码表示法是整数的一种简单的表示法,符号位用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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有