簡體   English   中英

python中的位移

[英]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 ,其中ss的值, eexp的值, mmantisse的值。

每個組件下的位數。 如果將浮點數乘以 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM