您好,登錄后才能下訂單哦!
本篇文章為大家展示了python移位運算的實現,內容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。
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,對于移位運算都有:
左移:
運算規則:
按二進制形式把所有的數字向左移動對應位數,高位移出,低位補零。
在數字沒有溢出的前提下,對于正數和負數,左移一位都相當于乘以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
0b1000000Process finished with exit code 0
同理,右移可以用>>或者除以2**n,相當于取商,不要余數。不過有符號區別。
但同時注意運算符優先級的問題,
python中,優先級從高到低分別是:
**,~+-(按位翻轉如~1,-1),* / % //,+-(普通加減法),<< >>....
雖然乘以2**n和<<效果一樣,但是在運算中可能因為運算優先級的問題導致運算結果不同。
之前sha1填充消息代碼過程整理一下如下:
遍歷過程:
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 填充消息結束。
上述內容就是python移位運算的實現,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。