Python 二进制字符串移位

Python binary string shift

我正在 Python 中研究 DES 算法。

在其中一个函数中,即 Fiestle 函数,我必须对元素进行异或运算才能得到密码。

有什么方法可以在python中执行移位操作,下面是我试过的代码:

C0 为 1111000011001100101010101111

D0 是 0101010101100110011110001111

c0_d0=[]
for i in range(1):
    t=[]
    t.append(C0)
    t.append(D0)
    c0_d0.append(t)

#print c0_d0 

def str_to_bin(strr,shifts):
for i in range(1,17):
    temp=[]
    for j in range(1):
        temp.append(int(c0_d0[i-1][0])<<1)
        temp.append(int(c0_d0[i-1][1])<<1)
    c0_d0.append(temp)

return c0_d0

我得到的输出是这样的:

我希望元素是通过移位获得的二进制字符串 bits.That 是第一个元素对是通过移动前一个元素对获得的,下一个元素对是通过前一个元素获得的,所以 on.Only给出第 0 个索引元素。

例子 C0 是 1111000011001100101010101111 D0 是 0101010101100110011110001111

C1 应该是 C0<<1 等于 1110000110011001010101011110

D1 应该是 D0<<1 等于 1010101011001100111100011110

尽量不要使用十进制或字符串编码的二进制;按原样使用数字更加有效和一致,并且 Python 支持将它们转换为其他基数或从其他基数转换。

>>> C0=0b1111000011001100101010101111
>>> bin(C0<<1)
'0b11110000110011001010101011110'

虽然在某些时候你会想要限制你的大小,因为 Python 支持任意大的整数(在 Python 2 中称为 long,这是 L来自您的输出,或者只是 int in Python 3)。这通常通过位掩码来完成。如果您想在特定的基础上显示结果,您也可以使用特定的宽度进行格式化。

>>> bin(C0 & ((1<<16)-1))  # truncate to 16 bits
'0b1100101010101111'
>>> '{:032b}'.format(C0)   # format as 32 digit binary string
'00001111000011001100101010101111'

特别不切实际的是您的示例输出混合了字符串和数字形式的数据。

这是一个示例,说明如何从字符串中解析二进制文件(以防您的程序将其作为输入接收),以及一种更直接的格式化方法。

>>> D = int('0101010101100110011110001111', 2)  # parse as binary = base 2
>>> D
89548687
>>> format(D, '032b')
'00000101010101100110011110001111'