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


    题目描述:

    给出两个不大于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 }
  • 相关阅读:
    队列

    有序数组
    集合:一条规则决定性能
    基础数据结构:数组
    空间复杂度
    插入排序
    重新认识Javascript的一些误区总结
    Knockout: 使用knockout validation插件进行校验, 给未通过校验的输入框添加红色边框突出显示.
    Knockout: 使用CSS绑定和event的blur失去焦点事件, 给未通过校验的输入框添加红色边框突出显示.
  • 原文地址:https://www.cnblogs.com/jasonJie/p/5747346.html
Copyright © 2020-2023  润新知