我一直在尝试解决这个问题,指令说可以使用位移位和位智能操作员这样做,但是我似乎无法接近解决方案。
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
。好工作!然后,您将其翻译成代码,但不太正确。您想使用检查a
的b
是否打开,但是您检查了b
的b
位。哎呀:)
但是,当然,这不使用位运算符。因此,您使用了第二个技巧:寻求帮助!我也经常使用这个。我认为我在此网站上提出的问题比我回答的要多。它奏效了:您有两种编码的方法,您将获得第三种。
现在,我将为您的"元编织"包给您两个技巧。您可能已经知道这些,但是如果是这样,您忘了应用此内容:
解决了一个简单的案例(越容易)
选择一个很好的特殊情况可能需要一些直觉和/或反复试验,但是在这里,很难看到这里的简单案例是当您被要求使用最少的一点时。(有趣的事实:这是告诉您数字是否甚至是奇数的。显而易见,一旦有人提到它,但有时不是更早。)那么如何做到这一点?使用仅位移动,这有点棘手。(Flynsee设法做到了;请参阅他的last_bit
功能。)但是,大概您可以使用其他位操作,如果您阅读了TessellatingHeckler的答案,则您已经知道他使用了什么位操作,除了Shifts以外。如果您还没有阅读,这是挑战自己的好机会。在考虑几秒钟之前,不要阅读下一个句子。一两分钟会更好。也许我什至应该使用"扰流板"标签?不。好的,这已经足够了,这里的完美位运算符是位。特别是,number&1
会告诉您一个数字是偶数还是奇数。(如果这不是明显的话,请停下来思考几分钟,直到您明白为什么。)
我们现在准备好第二个技巧:
将硬箱变成简单的案例
这并不总是可能的,但通常值得尝试。在这里,我们可以解决这样的问题:我有一种方法可以获取最后一位(或者是根据您从哪一边计算出来的),但我想要b
thit。如果只有某种方法可以将b
钻头移至我想要的位置。但是所有其他愚蠢的位都在我的路上。我希望我能以某种方式摆脱它们。等待一分钟...我想移动b
位?移动?也称为Shift?嗯...
我现在让您解决其余部分:)我希望这至少部分回答您的"模糊"问题