题记(7)--位操作练习

目录

一、题目内容

二、输入描述

三、输出描述

四、输入输出示例

五、完整C语言代码


一、题目内容

给出两个不大于65535的非负整数,判断其中一个的16位二进制表示形式,是否能由另一个的16位二进制表示形式经过循环左移若干位而得到。 循环左移和普通左移的区别在于:最左边的那一位经过循环左移一位后就会被移到最右边去。比如: 1011 0000 0000 0001 经过循环左移一位后,变成 0110 0000 0000 0011, 若是循环左移2位,则变成 1100 0000 0000 0110

二、输入描述

每行有两个不大于65535的非负整数

三、输出描述

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

四、输入输出示例

输入:

2 4
9 18
45057 49158
7 12

输出:

YES
YES
YES
NO

五、完整C语言代码

AC代码~

#include <stdio.h>

// 判断两数组是否相同
int Judge(int a[], int b[], int n) {
    for (int i = 0; i < n; i++)
        if (a[i] != b[i])
            return 0;
    return 1;
}

// 数组循环左移1位
void shift(int a[], int n) {
    int t = a[0];
    for (int i = 1; i < n; i++)
        a[i - 1] = a[i];
    a[n - 1] = t;
}

int main() {

    int a[16] = {0};
    int b[16] = {0};
    int m, n;
    while (scanf("%d%d", &m, &n) != EOF) {
        int i = 15;
        while (m != 0) {
            a[i--] = m % 2;
            m = m / 2;
        }
        i = 15;
        while (n != 0) {
            b[i--] = n % 2;
            n = n / 2;
        }
        for (int i = 1; i <= 16; i++) {
            shift(a, 16);
            if (Judge(a, b, 16)) {
                printf("YES\n");
                break;
            }
        }
        if (!Judge(a, b, 16))
            printf("NO\n");
    }
    return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值