论自增与自减

文章讨论了C++中自增和自减操作的实现方式,以及如何使用位运算进行优化。通过位运算符,如按位取反,作者提出了一种看待自增和自减的新视角,并展示了如何利用这些运算实现自增和自减。尽管这种优化可能提供微小的时间复杂度改进,但通常编译器已经内置了类似的优化,因此在大多数情况下,标准的自增和自减操作符已经足够高效。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

简介

在c++里,自增是一个变量自身加上一,再把新值赋值到自身变量上,自减则反之。

那么,我们可以将自增写成伪代码:

变量=变量+1

自减

变量=变量-1

那么在c++中有两种形式来吧自增自减实现出来。

 //++i 的实现方式   
 INT INT::operator++()  
 {  
     *this = *this +1;  
     return *this;  
 }  
 
 //i++的实现方式  
 
 const INT INT::operator++(int)  
 {  
     INT oldvalue = *this;  
     *this = *this+1;  
     return oldvalue;  
 }  

可以很清楚的看到++变量是先将自身加一,然后返回自身,而变量++则是定义一个存储变量存储变量本身,然后将变量本身加一,再返回存储变量。这明显慢了一步。

所以++i比i++更快。(也有些编译器能自动优化掉)

然而自增有些区别,但是自减没有太大的时间区别

优化

在c++里最快的运算莫属于位运算。

位运算包含:

|

&

!

~

^

>>

<<

七种,那么自增和自减与位运算有什么关系呢?

探究

我们先来看一下~运算符。

按位取反:按二进制位各个位全部取反

我们先从自增开始

自增

~5:

5的原码:

00000101

补码:

00000101

按位取反:

11111010

注意最前面的符号是正负数

得到了取反后的补码,把补码化成反码

注意负数的补码换反码是反码=补码-1

换码

11111001

负数的反码按位取反就是原码,符号位不变

10000110

结果就是-6

注意到了什么没有?,-6与5,5与-6,把-6转正成为6,5和6,这不就是自增吗?

那么我们就可以把它写成公式:i+1=-~i

自减

这里可能有人会说:我们都有了自增了,那自减不就是自增-2吗,简单简单。

可以但是还可以优化

再怎么优化呢?

我们还得用上按位取反。

按位取反是-(i+1)

那么如果现将i转号呢

-((-i)+1)

=0-(1-i)

=0-1+i

=i-1

i-1!

这就是自减啊。

总结

虽然这些歪门邪道的方法能优化一点点时间复杂度,但是编译器自带的优化一般也会将时间复杂度化成这么多,所以只要不是特别需要,++i和--i已经够用了。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值