首页 > 其他 > 详细

3:位查询

时间:2020-02-19 13:38:36      阅读:71      评论:0      收藏:0      [点我收藏+]

描述

    给出N个范围在[0, 65535]的整数,编程支持以下的操作:


(1)修改操作:C d,所有的数都增加d。如果超过65535,把结果模65536。 0 <= d <= 65535 
(2)查询操作:Q i,统计在N个正整数中有多少个整数其对应的二进制形式的第i位二进制位为非0。0 <= i <= 15。并且最低位i为0。

  最后,输出所有查询操作的统计值。

输入输入的第一行为两个正整数N,M,其中N为操作的整数的个数,而M为具体有多少个操作。
输入的第二行为N个正整数,为进行操作的N个正整数。
下面有M行,分别表示M个操作。

N<=100000,M<=200000输出输出所有查询操作Q的统计值,每一个查询操作统计结果输出为一行。

样例输入

3 5
1 2 4
Q 1
Q 2
C 1
Q 1
Q 2

样例输出

1
1
2
1

提示只输出查询操作Q的统计值。

# include <iostream>
using namespace std;
int main()
{
    int n,m;//N为操作的整数的个数,而M为具体有多少个操作。
    char op;//操作类型 
    int num;//操作数 
    int a[66000];//保存数据
    int i,j;
    int count=0;//计数 
    int check;
    //输入 被操作的数据 
    cin>>n>>m;
    for(i=0;i<n;i++){
        cin>>a[i];
    }
    //处理 
    
    for(i=0;i<m;i++){
        cin>>op>>num;
        //C操作 
        if(op==C)
            for(j=0;j<n;j++){
                a[j]+=num;
                a[j]%=65536;//此处不要忘记!! 
                //cout<<a[j]<<" ";
            }
                        
        //Q操作    
        if(op==Q){
            //数据转化为二进制 
            count=0;
            for(j=0;j<n;j++){
                check=a[j]>>num;//>>(右移)将一个数的各二进制位右移N位,
                               //移到右端的低位被舍弃,对于无符号数,高位补0。
                if(check%2==1)
                    count++;
            }
            cout<<count<<endl;
        }
        
        
    }        
}

复习一下:

1.左移<<   右移>>

运算符含义描述
<< 左移 用来将一个数的各二进制位全部左移N位,高位舍弃,低位补0。
>> 右移 将一个数的各二进制位右移N位,移到右端的低位被舍弃,对于无符号数,高位补0。

1>>1=0 ,  2>>1=1 ,  3>>1=1

4>>1=2, 4>>2=1

TIPS:操作的数据为二进制

 

2.十进制数转化为二进制数

#include <iostream>
using namespace std;
int main(){
    int n,i=0,j;
    int a[100];
    cin>>n;
    while(n){
        a[i]=n%2;
        n/=2;
        i++;
    }
    for(j=i-1;j>=0;j--)
        cout<<a[j];
}

 

3:位查询

原文:https://www.cnblogs.com/ANullValue/p/12330935.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!