位运算基础

初见安~【终于想起来要写个最基础的东西了呵呵。

位运算是个很方便的东西。嗯。在某种程度上还比较省时间——毕竟是二进制——最底层的直接操作。

以下是一些基础的运算方式——

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——

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值