初见安~【终于想起来要写个最基础的东西了呵呵。
位运算是个很方便的东西。嗯。在某种程度上还比较省时间——毕竟是二进制——最底层的直接操作。
以下是一些基础的运算方式——
1.与 &
与运算是两个二进制数中,若相同位均为1则结果位为1否则为0的操作。
如:
2&3=2,即10&11=10。
一般应用:判断一个数是否偶数。若n&1=1则为奇;为0则为偶。
如:
3&1=1,即11&1=1。
2.或 |
或运算是两个二进制数中,若相同位有一个为1则为1否则为0的操作,和与运算的不同就是both和or的区别。
如:
2&3=3,即10|11=11。
一般应用:同理:强行或1,我们可以发现任何一个数n=n|1后n的最后一位都一定变成了1,所以输出距离n最近的一个较小偶数可以用(n|1-1)实现。
3.异或 ^
异或运算是对两个等长的二进制数进行的取位操作:若相同位上的数相同则为0,否则为1。
如:
2&3=1,即10^11=01。
一般应用:由某个大佬得出:a^b^b=a。且若n为奇数,则n^1=n-1;偶数则n^1=n+1。
4.非 ~
非运算(按理说)是将一个二进制数的所有位都取反,即1变为0,0变为1。
如:
~0=-1。
一般~在邻接表存图循环的时候会用一下,而且按理来说一个不带符号的数取反应该是该类型与这个数的差,但输出来:
~n=-(n+1)。【不明为何。求大佬相解
5.左移 << 与右移 >>
众所周知——二进制的话每移动一位就是和2进行一次乘or除的操作。左移右移也是干这么个事儿——
n<<1=n * 2
n>>1=n / 2
移动x位就是和2的x次方进行乘除运算。
相比* 和 /,<< 和 >> 要相对快一些。其原因在章头已提过。
一般应用:
判断n的第i位是否为1:
if((1<<(i-1))&n==1);
将n的第i位改为1:
n=n|(1<<(i-1));
迎评:)
——End——