您如何使用BIT Shift Operators使用Python在基本2中找到一个数字的某个数字



我一直在尝试解决这个问题,指令说可以使用位移位和位智能操作员这样做,但是我似乎无法接近解决方案。

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')

我们必须使用位移位或明智的操作员,但是如您所见,我的SAD代码不包含其中任何一个。这是输入和输出应该是这样的:

Sample Input:
4 3
Sample Output:
On

任何人都可以告诉我,我应该如何在其基本2形式中找到同一数字的第n个数字?(还是这是正确的问题?)我认为更好(尽管更含糊)的问题是我如何解决此代码?

预先感谢!

从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.

位和原始数字在所选位置。

def nth_bit(number, position):
    state = number & (1 << position - 1)
    print('On' if state else 'Off')

在python中与大多数语言一样,位移动运算符 <<>>移动数字的二进制表示。例如13的二进制表示形式是1101。将其转移到左侧将提供11010,即26,然后转移到右侧的110,即6

如果要访问二进制表示中的第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完成,但是您要求使用位置操作提供解决方案。

对不起,此答案很长,需要更多段落中断。但是无论如何,请阅读,因为它是唯一一个试图回答您"模糊"问题的人。

有趣的是,bin功能实际上确实存在!而且它几乎完全可以做您想要的。(它将0b粘在前面,但由于您从右边计算,这并不重要。)

擅长编程(以及其他事情)的一部分是开发一个很好的技巧。(有人说这是很大的部分,其他人则说这是一小部分,但绝对是一部分。)如果您进行这样的练习,那么位操作员最终将成为您的书包的一部分。您将能够看几秒钟的问题,想一想:"这种气味可以通过位移动解决",五分钟后,您将有一个工作解决方案。

拥有一袋"元编剧"更为重要。这个袋子通常要小得多,但非常有用。元编织袋中最大的隔间被标记为"当我不知道该怎么做时要尝试什么"。从您的问题中,我可以看到您已经在此隔间中至少有两个这样的技巧。我认为您使用的第一个技巧是"如果没有计算机,我该怎么做?"。我个人使用了很多。您认为:如果有人给我一个用二进制书写的数字并要求n数字,我会数数字,直到到达n。好工作!然后,您将其翻译成代码,但不太正确。您想使用检查ab是否打开,但是您检查了bb位。哎呀:)

但是,当然,这不使用位运算符。因此,您使用了第二个技巧:寻求帮助!我也经常使用这个。我认为我在此网站上提出的问题比我回答的要多。它奏效了:您有两种编码的方法,您将获得第三种。

现在,我将为您的"元编织"包给您两个技巧。您可能已经知道这些,但是如果是这样,您忘了应用此内容:

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

选择一个很好的特殊情况可能需要一些直觉和/或反复试验,但是在这里,很难看到这里的简单案例是当您被要求使用最少的一点时。(有趣的事实:这是告诉您数字是否甚至是奇数的。显而易见,一旦有人提到它,但有时不是更早。)那么如何做到这一点?使用仅位移动,这有点棘手。(Flynsee设法做到了;请参阅他的last_bit功能。)但是,大概您可以使用其他位操作,如果您阅读了TessellatingHeckler的答案,则您已经知道他使用了什么位操作,除了Shifts以外。如果您还没有阅读,这是挑战自己的好机会。在考虑几秒钟之前,不要阅读下一个句子。一两分钟会更好。也许我什至应该使用"扰流板"标签?不。好的,这已经足够了,这里的完美位运算符是位。特别是,number&1会告诉您一个数字是偶数还是奇数。(如果这不是明显的话,请停下来思考几分钟,直到您明白为什么。)

我们现在准备好第二个技巧:

将硬箱变成简单的案例

这并不总是可能的,但通常值得尝试。在这里,我们可以解决这样的问题:我有一种方法可以获取最后一位(或者是根据您从哪一边计算出来的),但我想要b thit。如果只有某种方法可以将b钻头移至我想要的位置。但是所有其他愚蠢的位都在我的路上。我希望我能以某种方式摆脱它们。等待一分钟...我想移动b位?移动?也称为Shift?嗯...

我现在让您解决其余部分:)我希望这至少部分回答您的"模糊"问题

最新更新