-
总时间限制:
- 1000ms 内存限制:
- 65536kB
-
描述
-
给出两个不大于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
问题链接:Bailian3718 位操作练习
问题分析:这是一个位运算的问题。程序说明:无符号短整数的输入格式是"%hd",头一次使用。16位整数的类型是short int,这个问题使用无符号的16位整数最为合适。循环左移i位,相当于左移i位与右移16-i位的或,这是关键。
AC的C语言程序如下:
/* Bailian3718 位操作练习 */
#include <stdio.h>
#define N 16
int main(void)
{
int n, flag, i;
unsigned short int a, b, a1, a2;
scanf("%d", &n);
while(n--) {
scanf("%hd%hd", &a, &b);
flag = 0;
if(a == b)
flag = 1;
else
for(i=1; i<N; i++) {
a1 = a << i;
a2 = a >> (N - i);
if((a1 | a2) == b) {
flag = 1;
break;
}
}
printf("%s\n", flag == 1 ? "YES" : "NO");
}
return 0;
}