C基本算数、逻辑运算符 & && | || ^ ! << >>

&  |  ^ ! << >>  是位运算符
& 按位与 如果两个相应的二进制位都为1,则该位的结果值为1,否则为0
|  按位或 两个相应的二进制位中只要有一个为1,该位的结果值为1
^  按位异或 若参加运算的两个二进制位值相同则为0,否则为1
~ 取反 ~是一元运算符,用来对一个二进制数按位取反,即将0变1,将1变0
<< 左移 用来将一个数的各二进制位全部左移N位,右补0
>> 右移 将一个数的各二进制位右移N位,移到右端的低位被舍弃,对于无符号数,高位补0

整数前提下
左移一位 相当于乘以2
右移一位 相当于除以2
之前考虑 左移 右移的界限 区间,是多虑了,老去想右移到头不就是0了吗,左移太多不就越位了吗。
其实一个整数如果乘以太多越界了那就越界了,如果除以太多也就是0。
这里有个小技巧,比如乘以5,可以左移2次,然后再累加一次本身,
这样与乘5等价,用移动的方式去替代乘除来以优化性能。

||  && 是逻辑运算符
&&是且的意思,a&&b 两者都为真才为真. ||是或的意思,a||b 两者有一为真即真.



使用与运算符代替求余运算符
原文引自:http://blog.csdn.net/lzy340623339/article/details/9951181
1.性能对比:
求余运算:a % b就相当与a-(a / b)*b 的运算。
与运算:就是一个指令的事
2.在特殊场景下,是否能用与&替代%呢?
在对10进行求余的时候,我们发现,余数总是整数中的个位上的数字,而不用管其他位是什么;
在与运算中,我们经常需要使用位操作符&来取某些位上的值,
例如使用0xff&0x17ae来获取低8位的值,现在我们已经发现有点关联了,如果求余结果值的范围刚好跟是[0,求余的底数(a%b中的b))集合一样,那么低位就是求余的结果。
23%16 == 7
23 (0x17)& 0x0F == 0x07
所以,当需要对2的次幂进行求余时,可以是使用&运算符来代替,效率会倍儿棒。
当x=2^n(n为自然数)时,
a % x = a & (x  - 1 )

个人注解:
2^n 就是二进制 10 后面再加N个0,例如:8 就是 10 000
所以2^n-1 是为了得出 11111.....,
当1111...与a值 与操作时,得到的就是a去掉高位(x的倍数),得到余下的低位,也就是余数了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值