1151_位操作练习

// 1151_位操作练习.cpp : 定义控制台应用程序的入口点。
//

//题目1151:位操作练习
//时间限制:1 秒内存限制:32 兆特殊判题:否提交:1828解决:1015
//题目描述:
//给出两个不大于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
//来源:
//2010年北京大学计算机研究生机试真题

#include "stdafx.h"
#include "stdio.h"
int main()
{
    int n;
    unsigned short a,b;
    scanf("%d",&n);
    for (int i=0;i<n;i++)
    {
        scanf("%hu %hu",&a,&b);          //unsigned是%hu
        unsigned short a1,a2;
        int flag = 0;
        for(int j=0;j<16;j++)
        {       
            a = (a >> 15 )|( a << 1);  //循环左移一位(普通右移15位和普通左移1位进行|操作)

            if(a == b)
            {
                printf("YES\n");
                flag = 1;
                break;
            }
        }
        if (flag == 0)
        {
            printf("NO\n");
        }
    }
    return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章