算法基础---位运算

一、概述:

任何数据在计算机中都是以二进制存储,位运算是指直接对二进制位进行操作,所以效率很高。

二、运算符:

符号含义运算规则
&0&0=0;0&1=0;1&1=1;1&0=0;
|1|1=1;1|0=1;0|1=1;0|0=0;
~去反~0=1;~1=0;(结合性:右到左)
^异或1^1=0;1^0=1;0^1=1;0^0=0;(相异为1,相同为0)
<<左移

0001<<k=0100,k=2,k是左移的位数,这里k = 2.

>>右移

0100>>k=0001,k=2,k是右移的位数,这里k = 2.

三、操作

(一)n的二进制表示中第k位(自右向左)是几?//有第0位:

  1. 先把第k位移到最后:  n>>k;
  2. 看个位是几:x&1

总:1+2:n>>k&1

 

int main()
{
    int n=10;
    for(int k=3;k>=0;k++)
    {
        coutt<<(n>>k&1)
    }
    return 0;
}

(二)、lowbit(x):返回x最后一位1及后面所有零。

返回:x&-x 或 x&(~x+1) 

例:求二进制中1的个数

int lowbit(int x)
{
    return x&-x;
}
int main()
{
    int n;
    cin>>n;
    while(n--)
    {
        int x;
        cin>>x;
        int res=0;
        while(x){
            x-=lowbit(x);
            res++;
        }//每次减去x的最后一位1
    }
    cout<<res<<endl;
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值