[英]Bit shifting in python
我想了解以下代碼。 第三條線在做什么?
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
的值。
每個組件下的位數。 如果將浮點數乘以 2 的冪,則指數部分會隨着該冪的增加而增加。 因此,由於您乘以 8(您的問題中可能存在錯誤),因此您將指數增加 3 並獲得。
原始浮點數:
+-+--------+-----------------------+
|0|01111111|01000011110101110000101|
+-+--------+-----------------------+
1 8 23
最終浮點數:
+-+--------+-----------------------+
|0|10000010|01000011110101110000101|
+-+--------+-----------------------+
1 8 23
然而,你在這里所做的並沒有改變。 移位意味着您將數據視為位序列並將它們向左或向右移動。 無論該序列的語義解釋如何,您都(通常)這樣做。 移位通常使用<<
和>>
運算符完成。
如果i
是整數,
i * 2**bits
等於
i << bits
舉個例子 :
>>> 1 * 2**8
256
>>> 1 << 8
256
>>> 2 * 2**8
512
>>> 2 << 8
512
但是<<
沒有為 floats 定義:
>>> 1.265 << 8
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for <<: 'float' and 'int'
你可以想到:
* 2**bits
作為<< bits
到浮點數的擴展。 :
>>> 1.0 * 2**8
256.0
>>> 1.00000000001 * 2**8
256.00000000256
>>> 1.265 * 2**8
323.84
>>> 1.99999999999 * 2**8
511.99999999744
>>> 2.0 * 2**8
512.0
作為比較, n!
僅為非負整數定義,但Γ(z)
為任何復數定義,並且在插入自然數時與階乘函數一致。 看到這個線程。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.