用移位代替“加,减,乘,除”,全面进入移位时代

位操作代替算术运算,是一种高效的方法,在普通的编程当然不必要这么用,但是在嵌入式开发到是很常用的,我在这里举几个例子,纯粹当娱乐哈

 

 

减法:

 

56- 34

 

int  i=56;

i = i&(~32)&(~2);

解释如下:

位运算其实先就是把减数化成 2,4,8,16,32。。。因为这些数字代表内存中一个字节的1,2,3,4,5位。。。所以34化成32 + 2,二进制为00100000 + 00000010   “~”符号为取反的意思,所以(~32)+(~2)=11011111+11111101,那么56&(~32)==56&*(11011111)其实把56的第6位置为0了,那么等于是把56减去了一个32,而在来个i&(~2)等于是让i减去了2,这样就达到了减去34的效果

 

加法和减法同一个道理

 

 

 

乘法:

 

 

56*34

int i = 56;

i= i <<5 + i<<1;

 

解释如下:

同理 34 = 32 + 2;

i * 34 = i *(32 + 2)

因为 i*2其实是把i向左移动了一位,i/2是向右移动了一位

所以i*32是左移5位,i*2是左移1位

 

 

 

除法

56/34

int i = 56;

i= ((i<<4) + (i<<3) + (i<<2) +(i<<1))>>10

 

解释如下:

34首先要化成     x(必须是2的倍数)/y  的形式

x越大  结果越精确 我这里取的是1024  所以  y = 1024/34  约等于y=30=16+8+4+2

所以  i = i/34 = i/ (1024/34)= i / (1024 / (16+8+4+2)) = (16i +8i + 4i + 2i)/1024= ((i<<4) + (i<<3) + (i<<2) +(i<<1))>>10

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值