& | ^ ! << >> 是位运算符
& 按位与 如果两个相应的二进制位都为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的倍数),得到余下的低位,也就是余数了。
& 按位与 如果两个相应的二进制位都为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的倍数),得到余下的低位,也就是余数了。