码迷,mamicode.com
首页 > 其他好文 > 详细

九度oj 题目1151:位操作练习

时间:2016-08-07 23:00:41      阅读:188      评论:0      收藏:0      [点我收藏+]

标签:

题目描述:

给出两个不大于65535的非负整数,判断其中一个的16位二进制表示形式,是否能由另一个的16位二进制表示形式经过循环左移若干位而得到。

循环左移和普通左移的区别在于:最左边的那一位经过循环左移一位后就会被移到最右边去。比如:
1011 0000 0000 0001 经过循环左移一位后,变成 0110 0000 0000 0011, 若是循环左移2位,则变成 1100 0000 0000 0110

输入:

第一行是个整数n, 0 < n < 300000,表示后面还有n行数据
后面是n行,每行有两个不大于65535的非负整数

输出:

对于每一行的两个整数,输出一行,内容为YES或NO

样例输入:
4
2 4
9 18
45057 49158
7 12
样例输出:
YES
YES
YES
NO

自己对位运算确实不熟悉,看了看资料,循环左移为

(a >> (N - n)) | (a << n)

但这样并不完全正确,答案应在&2的N次方

代码如下

 1 #include <cstdio>
 2 #include <cstdlib>
 3 #define N 16
 4 
 5 int lcf(unsigned int a, int n) {
 6     int b = a >> (N - n);
 7     int c = a << n;
 8     return (b|c)&65535;
 9 }
10 
11 int main(int argc, char const *argv[])
12 {
13     int m;
14 
15     while(scanf("%d",&m) != EOF) {
16         int tmpa, tmpb;
17         while(m--) {
18             scanf("%d %d",&tmpa, &tmpb);
19             bool isOk = false;
20             for(int i = 0; i < N; i++) {
21                 int tmpc = lcf(tmpa, i);
22                 if(tmpc == tmpb) {
23                     isOk = true;
24                     break;
25                 }
26             }    
27             if(isOk) {
28                 puts("YES");
29             }
30             else {
31                 puts("NO");
32             }
33         }
34     }
35     return 0;
36 }

 

九度oj 题目1151:位操作练习

标签:

原文地址:http://www.cnblogs.com/jasonJie/p/5747346.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!