你如何使用位移运算符使用python找出基数2中某个数字的某个数字?

时间:2017-09-20 03:39:44

标签: python bit-manipulation

我一直试图解决这个问题并且指令说可以使用位移和位操作符来实现,但我似乎无法接近解决方案。

The nth bit of an integer is the value of the nth place value of a number 
that's written in base 2.

我从中理解的是当你拿一个数字时,例如4,它的基数2表示将是100.因为它要求的是地方价值而不是位置,我认为第一位就是最右边,因此它将为0.第二位为0,第三位为1.

Given two integers a,b where a<=10**9 and 2**b<=a, write a code that checks 
whether the bth bit is on (or equal to 1). If it is on, print out 'On', 
otherwise, print 'Off'.

到目前为止,这就是我所拥有的,但我知道这不是我实际应该做的事情。

a = int(input())
b = int(input())
base2b = bin(b) #i don't even think this function exists
stringB = str(base2b)
call = stringB[-b] #-b because I started counting from the right
if call == 1:
    print ('On')
else:
    print('Off')

我们被要求使用位移或位操作符,但正如您所看到的,我的悲伤代码不包含任何这些。 这就是输入和输出应该是这样的:

Sample Input:
4 3
Sample Output:
On

任何人都可以告诉我,我应该如何在其基础2形式中找到相同数字的第n位数? (或者甚至是正确的问题?)我认为更好(虽然模糊不清)的问题是如何解决这个问题呢?

提前致谢!

3 个答案:

答案 0 :(得分:1)

从1开始,将它移动几个位置,直到它与你想要的位置匹配(n - 1,因为它已经在第一位,所以要到第三位需要移动两个位置,而不是三个)。

00001110    # 14 - input number
00000001    # 1 start with 1.
            # << shift it over to the nth place (3rd place)
00000100

            # AND the original with this. 
00000100    # a number if it was set in both, 0 if it wasn't.

按位并且原始数字在所选位置为1。

def nth_bit(number, position):
    state = number & (1 << position - 1)

    print('On' if state else 'Off')

答案 1 :(得分:0)

在python中,与大多数语言一样,位移运算符<<>>会移动数字的二进制表示。例如,13的二进制表示为1101。将其向左移动将1101026,向右移动会1106

如果要访问二进制表示中的第n个数字,可以采用以下方法:

# The following function simply accesses the last bit
def last_bit(number): 
    return number - (number >> 1 << 1) 

# Once we have shifted a number, the last bit is the one we are looking for
def nth_bit(number,position):
    return last_bit(number >> position)

注意:last_bit有点过分,因为它可以使用number%2完成,但您要求使用按位运算的解决方案。

答案 2 :(得分:0)

很抱歉这个答案很长,需要更多段落。但无论如何要读它,因为它是唯一一个(到目前为止)试图回答你的“含糊”问题的人。

有趣的是,bin函数确实存在!它几乎完全符合您的要求。 (它在前面贴了一个0b,但是从右边算起,没关系。)

擅长编程(和其他东西)的一部分是开发一个很好的抓取技巧。 (有人说这是一个很大的部分,其他人说它只是一小部分,但它绝对是一个部分。)如果你做了这样的足够的练习,按位运算符最终将成为你的包的一部分。你可以看几秒钟的问题,自己想想“这闻起来可以用位移来解决”,五分钟之后你就会有一个有效的解决方案。

拥有一包“元技巧”更为重要。这个包通常要小得多,但非常实用。包含元诡计的最大隔间标记为“当我不知道该怎么做时该尝试什么”。我可以从你的问题中看出,你已经在这个隔间中至少有两个这样的技巧。我认为你使用的第一个技巧是“没有电脑我该怎么做?”。我个人使用这一个很多。你想:如果有人给我一个用二进制写的数字并要求n数字,我会计算数字,直到我达到n。做得好!然后你把它翻译成代码,但不是很正确。您想检查b的{​​{1}}位是否已启用,而是检查了a的{​​{1}}位。糟糕:)

但是,当然,这不使用按位运算符。那么你用了第二招:寻求帮助!我也用这个很多。我想我在这个网站上提出的问题比我回答的要多。它有效:你有两种方法来编写代码,而你将获得第三种方法。

我现在将为你的“元诀窍”包给你两个技巧。您可能已经知道这些,但如果是这样,您似乎忘了应用这个:

解决一个简单的案例(越容易越好)

选择一个好的特殊情况开始可能需要一些直觉和/或反复试验,但这里不难看出这里的简单案例是当你被问到最不重要的位时。 (有趣的事实:这是告诉你数字是偶数还是奇数的一点。一旦有人提到它,但有时候不是更早,这一点很明显。)那么怎么做呢?使用位移是有点棘手的。 (Flynsee设法做到了;看到他的b函数。)但是可能你被允许使用其他按位操作,如果你已经阅读了TessellatingHeckler的答案,你已经知道他使用了什么按位操作,除了轮班。如果您还没有阅读,这是一个挑战自己的好机会。在你想了几秒钟之前,不要读下一句话。一两分钟会更好。也许我甚至应该使用“扰流”标签?罗。好的,这就足够了,这里完美的按位运算符是按位的。特别是,b会告诉您数字是偶数还是奇数。 (如果这不明显,请停下来思考几分钟直到你明白为什么。)

我们现在准备好迎接第二招:

将硬件转移到易于使用的场所

这并非总是可行,但通常值得尝试。在这里,我们可以像这样处理问题:我有办法得到最后一位(或第一位取决于你计算的那一方),但我想要last_bit位。如果只有某种方法将number&1位移动到我想要的位置。但所有这些其他愚蠢的东西都在我的方式。我希望我能以某种方式摆脱它们。等一下......我想移动b位?移动?也被称为班次?唔...

我现在让你解决剩下的问题:)我希望这至少部分回答你的“模糊”问题