首页 > 试题广场 >

位操作练习

[编程题]位操作练习
  • 热度指数: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
while True:
    try:
        n1,n2=map(int,input().strip().split(' '))
        def data(i,str1):
            i_list=list(i)
            lenth=len(i_list)
            str1_list=list(str1)
            result=False
            for j in range(lenth):
                index=i_list.pop(0)
                i_list.append(index)
                if i_list==str1_list:
                    result=True
                    break
            return result
        n1_bin=bin(n1).lstrip('0b')
        n2_bin=bin(n2).lstrip('0b')
        lenth1=len(n1_bin)
        lenth2=len(n2_bin)
        n1_bin='0'*(16-lenth1)+n1_bin
        n2_bin='0'*(16-lenth2)+n2_bin

        if data(n1_bin,n2_bin) or  data(n2_bin,n1_bin):
            print('YES')
        else:
            print('NO')

    except:
        break
编辑于 2019-08-12 00:09:58 回复(0)
a, b = map(int, input().split())
a_bin = bin(a)[2:].zfill(16)
b_bin = bin(b)[2:].zfill(16)
# 这一步很关键
if b_bin in a_bin + a_bin:
    print('YES')
else:
    print('NO')
简单明了
发表于 2019-07-14 23:19:32 回复(0)
try:
    while True:
        a,b = list(map(int,input().split()))
        a = "{:0>16}".format(bin(a).replace('0b',''))  #转换成16位二进制
        b = "{:0>16}".format(bin(b).replace('0b',''))
        for i in range(16):                            #循环左移
            a = a[1:]+a[0]
            if a == b:
                print("YES")
                break
        else:print("NO")
except Exception:
    pass
编辑于 2018-10-04 10:48:42 回复(0)

python solution

使用了deque,因为里面有rotate函数,不用再造轮子了~~


from collections import deque
a = int(input())
for i in range(a):
    a, b = map(lambda c: bin(c).replace("0b", "").rjust(16, "0"), map(int, input().split()))
    hasSolution = False
    for i in range(16):
        rotateDeque = deque(a)
        rotateDeque.rotate(-i)
        if rotateDeque == deque(b):
            hasSolution = True
            break
    print("YES" if hasSolution else "NO")

也可以使用移位操作,比这个更简单。。

编辑于 2017-10-16 16:59:40 回复(0)
def tran(a,b):
    if a==b:
        return 'YES'
    for i in range(1,17):
        if a<<i & 65535 | a>>16-i==b: #循环移i位
            return 'YES'
    return 'NO'
n=int(input())
for i in range(n):
    s=list(map(int,input().split()))
    print(tran(s[0],s[1]))

发表于 2017-09-04 22:02:29 回复(0)