以位计数功能

时间:2013-10-08 06:49:32

标签: python python-2.7

我正在尝试打印最大位数(n)以及这些位数能够表示的最大数量。我觉得问题出现在x = x%2

输入:

sortbit(3)

输出:

000
111
000
111
000
111
000
111

预期产出“

000
001
010
011
100
101
110
111

我的代码:

def sortbit(n):
    max_num = 2**n

    for x in range(0,max_num):
        stringy = []
        a = 0
        while a < n:
            a += 1
            x = x % 2
            if x == 0:
                stringy.insert(a,'0')
            else:
                stringy.insert(a,'1')
        t = ''.join(stringy)
        print t

3 个答案:

答案 0 :(得分:2)

您正在使用1将任意号码转换为0x = x % 2。您也可以打印str(x % 2) * n

您需要使用整数除法,并分别测试偶数或奇数。

更好的是,你可以将模数测试的输出作为字符串附加到stringy

stringy.insert(0, str(x % 2))
x = x // 2

使用简化的代码演示:

>>> def sortbit(n):
...     max_num = 2**n
...     for x in range(max_num):
...         stringy = []
...         for a in range(n):
...             stringy.append(str(x % 2))
...             x //= 2
...         print ''.join(reversed(stringy))
... 
>>> sortbit(3)
000
001
010
011
100
101
110
111

您也可以将值移位; >> operator通过给定的步数将位移到右边; x >> 1x中的位移一步,基本上除以2。

您还可以查看bin() function(将值作为二进制字符串返回,以0b开头)和format() function以及str.format() method,其中允许您使用b输出格式将值格式化为二进制字符串。在循环中打印您的值可以很简单:

def sortbit(n):
    for i in range(2**n):
        print '{:0{}b}'.format(i, n)

最后但并非最不重要的是,您只是生成数字0和1,n次的乘积。您也可以使用itertools.product()来表达:

>>> from itertools import product
>>> for bits in product('01', repeat=3):
...     print ''.join(bits)
... 
000
001
010
011
100
101
110
111

但这可能被视为作弊。 : - )

答案 1 :(得分:2)

你已经得到了特定代码的答案,所以这里有一个解决方案,使用Python的format来打印具有适当前导零数的二进制数字{/ 1}}:

n

答案 2 :(得分:1)

您应该在x % 2中使用if,而不是分配回x

if x % 2 == 0:
  ...

同样在每次迭代时你应该移到下一位,否则你会一遍又一遍地添加相同的位:

x = x >> 1