次のコードを理解したいです。3行目のシフトは何をしているのですか?
number = 1.265
bits = 8
shifted_no = 1.265 * (2** bits)
number と shift_no の結果のバイナリ形式を確認すると、次のようになります。
0011 1111 1010 0001 1110 1011 1000 0101
0100 0001 0010 0001 1110 1011 1000 0101
ありがとう。
次のコードを理解したいです。3行目のシフトは何をしているのですか?
number = 1.265
bits = 8
shifted_no = 1.265 * (2** bits)
number と shift_no の結果のバイナリ形式を確認すると、次のようになります。
0011 1111 1010 0001 1110 1011 1000 0101
0100 0001 0010 0001 1110 1011 1000 0101
ありがとう。
これnumber
は32 ビットの浮動小数点です。浮動小数点の構造は次のとおりです。
+-+--------+-----------------------+
|s| exp | mantisse |
+-+--------+-----------------------+
1 8 23
これは値(-1) 1-2×s ×2 e-127 ×1.mを表し、 sは の値s
、eは の値、exp
およびm
の値ですmantisse
。
各コンポーネントの下のビット数。float に 2 のべき乗を掛けると、指数部はそのべき乗でインクリメントされます。したがって、8 を掛けるので (おそらく質問に誤りがあります)、指数を 3 でインクリメントして取得します。
元の浮動小数点:
+-+--------+-----------------------+
|0|01111111|01000011110101110000101|
+-+--------+-----------------------+
1 8 23
最終浮動小数点:
+-+--------+-----------------------+
|0|10000010|01000011110101110000101|
+-+--------+-----------------------+
1 8 23
ただし、ここで行うことはシフトではありません。シフトとは、データを一連のビットとして見て、それらを左または右に移動することを意味します。そのシーケンスの意味解釈に関係なく、(通常は) これを行います。通常、シフトは<<
and>>
演算子で行われます。