1

我正在尝试打印最大位数 (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
4

3 回答 3

2

您已经获得了特定代码的答案,因此这是一个使用 Pythonformat打印n具有适当数量的前导零的二进制数字的解决方案:

>>> def sortbit(n):
...  for i in range(2**n):
...   print '{0:0{1}b}'.format(i,n)
...
>>> sortbit(2)
00
01
10
11
>>> sortbit(3)
000
001
010
011
100
101
110
111
于 2013-10-08T07:07:14.973 回答
2

您正在将任何数字转换为1or 或0with x = 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

你也可以位移值;>>操作员将位向右移动给定的步数;x >> 1将位移动x一步,基本上除以二。

您还可以查看bin()函数(将值作为二进制字符串返回,以 开头0b)和format()函数以及str.format()方法,它允许您将值格式化为二进制字符串以及使用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

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

于 2013-10-08T06:51:33.557 回答
1

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

if x % 2 == 0:
  ...

同样在每次迭代中,您应该移至下一位,否则您将一遍又一遍地添加相同的位:

x = x >> 1
于 2013-10-08T06:56:03.367 回答