本文主要是介绍Bailian3718 位操作练习【位运算】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
位操作练习
- 总时间限制:
- 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 16int 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;elsefor(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;
}
这篇关于Bailian3718 位操作练习【位运算】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!