pythonシフト演算

7101 ワード

title:pythonシフト演算date:2018-10-12 19:55:22 tags:#ラベル-PYTHON
pythonシフト演算
暗号アルゴリズムプログラム設計実践選択SHA-1.書く過程でpythonシフトに関する問題に遭遇したら、記録します.
SHA−1最初のステップはメッセージを埋め込む必要がある.sha 1がメッセージを埋め込む手順を簡単に説明します.
     “123”,   ascii ——313233,     3*8=24。
 
00110001 00110010 00110011
      1 1bit,   447-24bit 0。
10000000...00000000 
  64bit      24    0001 1000

       :
00110001 00110010 00110011 10000000...00000000 00011000
16    
31323380 00000000...0018

python部分コードブロック:
        M = input()
        # 1byte=8bit,L M     
        L = 8 * len(M)
        m=0
        for ch in M:#     M
            m = m * (2 ** 8) + ord(ch)
         #   print(hex(m))#  16   int  m      

    #  ,       448(mod512) 
        if L < 448:
            m = m * 2 + 1 #  
            #      
            m = m * 2 ** (447 - L)
            #     
            m = m * 2 ** 64 + L

pythonだけでなく、シフト演算には左シフト:演算規則:すべての数字をバイナリ形式で左に対応するビット数、高位をシフトし、低位をゼロに補う.数字があふれない前提の下で、正数と負数に対して、左シフト1ビットはいずれも2を乗じた1次方に相当し、左シフトnビットは2を乗じたn次方に相当する.
2**nを掛けると、左にn桁移動し、高位が0に移動し、右の低位の空席がゼロになります.
n=128
print(bin(n))

n1=n*2**2+1#1000 0000 00+0000 0001 -->1000 0000 01
print(bin(n1))
n2=n<<2+1
print(bin(n2))

m=8#0000 1000
print(bin(m))
m1=m*2**2+1#0000 1000 00 +0001  00001000 01
print(bin(m1))
m2=m<<2+1
print(bin(m2))

    :0b10000000
0b1000000001
0b10000000000
0b1000
0b100001
0b1000000

Process finished with exit code 0


同様に、右シフトは>>または2**nで割ることができ、商を取ることに相当し、残数をしないでください.しかし、記号の違いがあります.
しかし、演算子の優先度の問題にも注意してください.pythonでは、優先度が高いものから低いものまで、それぞれ次のとおりです.
**,~+-(     ~1,-1),* / % //,+-(     ),<< >>....

2*nと<
前にsha 1埋め込みメッセージコードプロセスでは、遍歴プロセスを整理しました.
L=24,m  = 0
  m  8 ,  m     00000000
      31,  m=00110001
m    8 ,   0,  m=00110001 00000000
      32,  m=00110001 00110010
m    8 ,  m=00110001 00110010 00000000
      33,  m=00110001 00110010 00110011
    。

補位プロセス:
  L<448,     64bit    ,        512bit。
m   1 ,   0
m=00110001 00110010 00110011 0
    1,m=00110001 00110010 00110011 1

     :m  448-1-L    , 447-L=423  。
m=00110001 00110010 00110011 1000000...00000000(1  423 0)

    :m  64bit, 
00110001 00110010 00110011 10000000...00000000
00000000 00000000 00000000 00000000 00000000
00000000 00000000 00000000
(1  423+64 0,         24+423+1+64=512bit)
m     L=24, 00011000。
m=00110001 00110010 00110011 10000000...00000000
00000000 00000000 00000000 00000000 00000000
00000000 00000000 000011000

      。

数学は本当に不思議ですね.(涼しい頭上を触った