Keshawn_lu's Blog

牛客网 KY52.位操作练习

字数统计: 376阅读时长: 1 min
2021/03/03 Share

题目简介:

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

输入描述:

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

输出描述:

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

输入

1
2
3
4
2 4
9 18
45057 49158
7 12

输出

1
2
3
4
YES
YES
YES
NO

思路:

这题的重点就是掌握循环左移的方法,即a = (a << 1) | (a >> 15)为循环左移一位。(16位二进制的情况下)

tip:

  • 由于题目要求是16位,且是正整数,所以需要使用unsigned short

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <unordered_map>
#include <cmath>
#include <iomanip>
#include <set>
#include <map>

using namespace std;


int main()
{
unsigned short a, b; //范围 0 ~ 65535 两个字节16位

while (cin >> a >> b) {

int n = 0;
while (n < 16) {

if (a == b) {

cout << "YES" << endl;
break;
}

a = (a << 1) | (a >> 15); //循环左移一位

n++;
}

if (n == 16)
cout << "NO" << endl;
}
}
CATALOG
  1. 1. 题目简介:
  2. 2. 输入描述:
  3. 3. 输出描述:
  4. 4. 输入
  5. 5. 输出
  6. 6. 思路:
  7. 7. 代码如下: