首页 > 试题广场 >

位操作练习

[编程题]位操作练习
  • 热度指数:8814 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 64M,其他语言128M
  • 算法知识视频讲解
给出两个不大于65535的非负整数,判断其中一个的16位二进制表示形式,是否能由另一个的16位二进制表示形式经过循环左移若干位而得到。 循环左移和普通左移的区别在于:最左边的那一位经过循环左移一位后就会被移到最右边去。比如: 1011 0000 0000 0001 经过循环左移一位后,变成 0110 0000 0000 0011, 若是循环左移2位,则变成 1100 0000 0000 0110

输入描述:
每行有两个不大于65535的非负整数


输出描述:
对于每一行的两个整数,输出一行,内容为YES或NO
示例1

输入

2 4
9 18
45057 49158
7 12

输出

YES
YES
YES
NO
#include <stdio.h>

int main() {
    unsigned short a, b;
    while (scanf("%hu%hu", &a, &b) == 2) {
        int flag = 0;
        for (int i = 0; i < 16; i++) {
            if (a == b) {  // 找到了匹配的情况
                flag = 1;
                break;
            }
            a = ((a << 1) | (a >> 15));  // 循环左移1位
        }
        printf("%s\n", flag ? "YES" : "NO");
    }
    return 0;
}
//如果二进制各个位置都相等,那原数也一定相等

发表于 2023-03-14 16:11:31 回复(0)
请问在c或c++中int不是32位吗,循环右移为什么是移动16-i,而不是32-i啊,小白一个,有点晕了
发表于 2022-10-03 17:21:09 回复(0)
#include<stdio.h>
#include<math.h>
int main (void){
    int a,c;
    while(scanf("%d %d",&a,&c)!=EOF){
        int flag=0;
        int * conversion(int a);
        int *b;
        int *d;
        b=conversion(a);
    //一共可以进行16次循环左移,每次循环判断左右两数能否相等
        for(int k=0;k<16;k++){
            int temp=b[15];
            //接下来开始进行一次的左移
            for(int i=0;i<16;i++){
                *(b+15-i)=*(b+15-1-i);
            }
            b[0]=temp;
            //这个用来看转换为的二进制
//             for(int i=0;i<16;i++){
//                 printf("%d ",*(b+i));
//             }printf("\n");
            //计算移位后的值
            int out=jisuan(b);
//             printf("%d ",out);
//             printf("\n");
            if (out==c){
                flag=1;
            }
       }
//         printf("\n");
        d=conversion(c);
    //一共可以进行16次循环左移,每次循环判断左右两数能否相等
        for(int k=0;k<16;k++){
            int temp=d[15];
            //接下来开始进行一次的左移
            for(int i=0;i<16;i++){
                *(d+15-i)=*(d+15-1-i);
            }
            d[0]=temp;
        //     //这个用来看转换为的二进制
        //     for(int i=0;i<16;i++){
        //         printf("%d ",*(b+i));
        //     }printf("\n");
            //计算移位后的值
            int out=jisuan(d);
//             printf("%d ",out);
            if (out==a){
                flag=1;
            }
       }
        
        if(flag==1){
           printf("YES\n");  
        }
        else{
            printf("NO\n");
        }
       
    }
    

    return 0;
}
//这个函数用来转换进制
int * conversion(int a){
    int jishu=0;
    int cunchu[100];
    int n=0;
    while(a!=1){
        n=a%2;
        a=a/2;
        cunchu[jishu]=n;
        jishu+=1;
    }
    cunchu[jishu]=1;
    
    int zong=jishu+1;
    int se[zong];
    for(int j=0;j<zong;j++){
        se[j]=cunchu[jishu-j];
    }
    //补全16位
    int se17[17];
    for(int i=0;i<zong;i++){
        se17[i]=se[i];
    }
    for(int i=zong;i<16;i++){
        se17[i]=0;
    }
    se17[16]=9;
    int *r=se17;

    return r; 
}
int jisuan(int a[16]){
    int sum=0;
    for(int i=0;i<16;i++){
        sum+=a[15-i]*pow(2,i);
    }
    return sum;
}

发表于 2022-02-27 16:57:29 回复(0)

问题信息

难度:
3条回答 7331浏览

热门推荐

通过挑战的用户

查看代码