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