在Python中将整数转换为二进制并比较位数

6

如何将 int 类型的 n 转换为二进制,并测试所得到的二进制数的每一位?

我在经过大量的搜索之后得到了以下信息:

def check_bit_positions(n, p1, p2):
    print int(str(n),2)

然而,我收到了一个错误:invalid literal for int() with base 2。请告诉我如何获得输入数字的二进制形式,并测试位于位置p1p2的每个位。

编辑:

binary = '{0:b}'.format(n)
if list(binary)[p1] == list(binary)[p2]:
     print "true"
 else:
     print "false"

上述代码现在可以正常工作,但是如何从列表末尾检查位置p1和p2呢?

你到底想做什么?测试特定的位是否打开? - arshajii
@arshajii 是的,我想知道如何测试列表开头和结尾的索引。请看我的更新。 - Tina S
您可以使用负索引来反向索引列表。l[-1]l的最后一个元素,l[-2]是倒数第二个元素,以此类推。 - arshajii
@TinaS 你可以使用负索引:binary[-p1] == binary[-p2]。在Python中,无需将字符串转换为列表,因为字符串是可迭代的。 - Ashwini Chaudhary
“binary”实际上只是一个字符串,可以直接使用,不需要将其包装在列表中。尝试在不将其转换为列表的情况下使用binary[p1] == binary[p2] - tdelaney
3个回答

7

使用bin()函数:

>>> bin(5)
'0b101'

或者使用 str.format
>>> '{0:04b}'.format(5)
'0101'

如果您不想要前导的0b,则可以使用bin(s)[2:]。 - Max
谢谢@RohitJain,你能帮我看看如何从列表末尾检查列表吗?即从列表末尾的位置p开始。由于声望不高,我无法点赞。 - Tina S
@TinaS。你可以使用负索引 - s[-1] == s1[-1]。而且你不需要将其转换为列表。你也可以在字符串上使用索引。 - Rohit Jain
我还有一个通用问题,我如何知道语言的所有结构。因为我可以看到这里的大多数答案都使用了非常少而且优化的代码,然而由于我的初学者水平,我似乎写了很长的代码。您有什么有用的提示吗? - Tina S
@TinaS 你可以从官方Python教程开始学习。此外,Python语言参考也非常有用。 - Rohit Jain
这是一个低性能的解决方案。ints已经是二进制的,你只需要&位即可。 - tdelaney

6

我写了一个快速函数来检查一个数字的第n位:

def check_nth_bit(num, n):
    return (num>>n)&1

基本上,你需要将数字 n 向右移动 n 位,这会将第 n 个数字放在最右边的位置,通过对新数字进行按位与操作并与 1(除了最右边的位置外都是0)进行比较,可以检查该位是 1 还是 0。因此,您可以使用 p1p2num 上调用此函数并比较结果。

编辑:这将从数字末尾(最低有效位)的 p1p2 开始计算。


谢谢你的回答,但我会选择上面提到的其中一个答案,因为它符合我的当前需求。不过,我会将你的方法作为辅助函数用于将来的使用。 - Tina S

3
您可以使用format
>>> format(10, 'b')
'1010'

int 用于将任何进制的数字转换为十进制,而您正在尝试使用它将整数转换为二进制,这是错误的。

>>> int('1010', 2)
10
>>> int('20', 2)
Traceback (most recent call last):
  File "<ipython-input-3-05fc7296a37e>", line 1, in <module>
    int('20', 2)
ValueError: invalid literal for int() with base 2: '20'

谢谢@Ashwini,我结合了@Rohit和你的答案并且能够继续进行。请问你能否告诉我如何测试一个列表中倒数第p个元素? - Tina S
@TinaS https://dev59.com/QnXYa4cB1Zd3GeqP52rD#rLgJoYgBc1ULPQZFa9S4 - Ashwini Chaudhary
@AshwiniChaudhary 你在评论中链接了相同的问题。 - Tina S
@TinaS 我链接了我的评论而不是问题。我在你的问题上发布了那个评论,在你对我的答案发表评论之前 - Ashwini Chaudhary
@AshwiniChaudhary 感谢您的时间和努力。不过我只能接受一个答案。 - Tina S
@TinaS 只是让你知道,在这个任务中更喜欢使用 format 而不是 str.format - Ashwini Chaudhary

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接