pythonシフト演算
7101 ワード
title:pythonシフト演算date:2018-10-12 19:55:22 tags:#ラベル-PYTHON
pythonシフト演算
暗号アルゴリズムプログラム設計実践選択SHA-1.書く過程でpythonシフトに関する問題に遭遇したら、記録します.
SHA−1最初のステップはメッセージを埋め込む必要がある.sha 1がメッセージを埋め込む手順を簡単に説明します.
python部分コードブロック:
pythonだけでなく、シフト演算には左シフト:演算規則:すべての数字をバイナリ形式で左に対応するビット数、高位をシフトし、低位をゼロに補う.数字があふれない前提の下で、正数と負数に対して、左シフト1ビットはいずれも2を乗じた1次方に相当し、左シフトnビットは2を乗じたn次方に相当する.
2**nを掛けると、左にn桁移動し、高位が0に移動し、右の低位の空席がゼロになります.
同様に、右シフトは>>または2**nで割ることができ、商を取ることに相当し、残数をしないでください.しかし、記号の違いがあります.
しかし、演算子の優先度の問題にも注意してください.pythonでは、優先度が高いものから低いものまで、それぞれ次のとおりです.
2*nと<
前にsha 1埋め込みメッセージコードプロセスでは、遍歴プロセスを整理しました.
補位プロセス:
数学は本当に不思議ですね.(涼しい頭上を触った
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
。
数学は本当に不思議ですね.(涼しい頭上を触った