首页 > 试题广场 >

位操作练习

[编程题]位操作练习
  • 热度指数: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
import java.util.Scanner;
import java.util.LinkedList;
import java.util.List;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
         Scanner sc = new Scanner(System.in);
        //String str = sc.nextLine();
        int num1 = sc.nextInt();
        int num2 = sc.nextInt();
        String s1 = Integer.toBinaryString(num1);
        String s2 = Integer.toBinaryString(num2);
       // System.out.println(num1+" "+num2);

        //System.out.println(s1+" "+s2);
        //System.out.println(str);
        char[] shuzu1 = s1.toCharArray();
        char[] shuzu2 = s2.toCharArray();
//        System.out.println(shuzu1);
//        System.out.println(shuzu2);
        LinkedList<Character> list1 = new LinkedList<>();
        LinkedList<Character> list2 = new LinkedList<>();
        for (int i = 0; i < shuzu1.length; i++) {
            list1.addLast(shuzu1[i]);
        }
        for (int i = 0; i < shuzu2.length; i++) {
            list2.addLast(shuzu2[i]);
        }
        while (true){
            if(list1.size()<16){
                list1.addFirst('0');
            }
            if(list2.size()<16){
                list2.addFirst('0');
            }
            if(list2.size() == 16 && list1.size()==16){
                break;
            }

        }

        int min = Math.min(shuzu2.length,shuzu1.length);
        boolean flag = false;
        int i = 0;
        while(i<min){
            for(int j = 0;j<min;j++){
                if(list1.get(j) != list2.get(j)){
                    break;
                }
                if(j == min-1 && list1.get(j) == list2.get(j)){
                    flag = true;
                    System.out.println("YES");
                }
            }
            if(flag) break;
            list1.addLast(list1.getFirst());
            list1.removeFirst();
            i++;
        }
        if(!flag) System.out.println("NO");

    }
}

编辑于 2024-03-09 15:04:43 回复(0)

循环左移使用如下方法

public static int cycleZuoyi(int n) {
        int k = 0xffff; // 用于消除左移后第17位的数
        int t = (n << 1) & k; // 消除第17位
        if (t != n * 2) {// 第16位是1
            t += 1;
        }
        return t;
    }
发表于 2019-02-14 21:00:59 回复(0)
其实这题不用一个个去移位再判断。本质上,是一个字符串匹配问题,所以只要用匹配的算法就行。

import java.util.*;
public class Main {
    public static void main(String[] args) {
        Scanner reader = new Scanner(System.in);
        int a = reader.nextInt();
        int b = reader.nextInt();
        String binary_a = convert(a);
        String binary_b = convert(b);
        for (int j = 0; j < binary_b.length(); ++j) {
            int last = j;
            int i = 0;
            while (binary_a.charAt(i) == binary_b.charAt(last)) {
                i = (i+1)%binary_a.length();
                last = (last+1)%binary_b.length();
                if (last == j) {
                    System.out.println("YES");
                    return;
                }
            }
        }
        System.out.println("NO");
    }
    public static String convert(int a) {
        StringBuilder sb = new StringBuilder();
        while (a > 0) {
            sb.insert(0, String.valueOf(a%2));
            a /= 2;
        }
        int len = sb.length();
        for (int i = 0; i < 16-len; ++i)
            sb.insert(0, "0");
        return sb.toString();
    }
}

发表于 2018-05-30 14:23:10 回复(0)

问题信息

难度:
3条回答 7329浏览

热门推荐

通过挑战的用户

查看代码