题目描述:给定一个正整数,找出与其二进制表示1的个数相同、略大和略小的2个数
# 获取略大的数
def getNext(num):
# n是为了统计出p和c1、c0
n = num
c1 = 0
c0 = 0
while n&1 == 0 and n != 0:
c0 += 1
n >>= 1
while (n&1) == 1:
c1 += 1
n >>= 1
p = c0+c1
# 类似于11111……0000这种输入和全0的输入
if p == 31 or p == 0:
return 'error'
num |= 1<<p # 将p位翻转为1
num &= ~((1<<p)-1) # 将p位后的清零,注意不能直接与1<<p,因为这样前面的都置为0
num |= (1 << (c1-1)) - 1 # 将最后几位填成1
return num
# 获取略小的数
def getPrev(num):
n = num
c1 = 0
c2 = 0
while n&1 == 1:
c1 += 1
n >>= 1
# 判断全0或者全1的情况
if n == 0:
return 'error'
while n&1 == 0 and n != 0:
c0 += 1
n >>= 1
p = c0+c1
# 将p位及以后的置0
num &= (~0<<(p+1))
# 在p后面放c1+1个1
mask = (1<<(c1+1))-1
num |= mask << (c0-1)
return num