位运算
来源:互联网 发布:评价汪精卫 知乎 编辑:程序博客网 时间:2024/05/19 02:04
好的20种位运算技巧:http://blog.csdn.net/zmazon/article/details/8262185
hdu6186
#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<cmath>using namespace std;const int MAXN = 100005;int a[MAXN];int b[40];int Pow(int n,int m){ int i,j; int sum = 1; for(i = 0;i < m;++i) { sum *= n; } return sum;}int main(){ int n,q; while(~scanf("%d %d",&n,&q)) { int i,j; memset(a,0,sizeof(a)); memset(b,0,sizeof(b)); for(i = 0;i < n;++i) { scanf("%d",&a[i]); } for(i = 0;i < n;++i) { for(j = 0;j <= 31;++j) { if((a[i] >> j) & 1 == 1) { b[j]++; //记录每个数在每个位上1出现的个数 } } } /*for(j = 0;j <= 31;++j) { printf("%d ",b[j]); } cout<<endl;*/ int x; for(i = 0;i < q;++i) { scanf("%d",&x); int m = 0,k = 0,p = 0; //利用与,或,异或的特性来求解 for(j = 0;j <= 31;++j) { int y = (a[x -1] >> j) & 1; if(y != 1) { if(b[j] == n - 1) { m += Pow(2,j); } if(b[j] > 0) { k += Pow(2,j); } if((n - 1) % 2 == 0) { if(b[j] % 2 != 0) { p += Pow(2,j); } } else{ if(b[j] % 2 != 0) { p += Pow(2,j); } } } else{ if(b[j] - 1 == n - 1) { m += Pow(2,j); } if(b[j] - 1 > 0) { k += Pow(2,j); } if(b[j] - 1 > 0){ if((n - 1) % 2 == 0) { if((b[j] - 1) % 2 != 0) { p += Pow(2,j); } } else{ if((b[j] - 1) % 2 != 0) { p += Pow(2,j); } } } } } printf("%d %d %d\n",m,k,p); } } return 0;}
阅读全文
0 0
- 位运算
- 位运算
- 位运算
- 位运算
- 位运算
- 位运算
- 位运算
- 位运算
- 位运算
- 位运算
- 位运算
- 位运算
- 位运算
- 位运算
- 位运算
- 位运算
- 位运算
- 位运算
- 20 Useful Commands for Linux Newbies
- java继承的小知识点
- GO 看变量占用内存情况
- frameset,frame和iframe用法
- logback 常用配置详解(序)logback 简介
- 位运算
- 《数字图像处理》--冈萨雷斯(第六章)
- 使用python的Flask实现一个RESTful API服务器端
- Makefile
- 一款好用的插件——油猴子
- 《数字图像处理》--冈萨雷斯(第九章)
- 矩阵快速幂,求斐波那契数列
- 《Python核心编程(第2版)》读薄(5)之dir()(关键词:Python/dir())
- paxos协议更新日志