在python中进行位移

时间:2017-02-08 10:25:57

标签: python bit-manipulation byte-shifting

我想了解以下代码。什么样的转变第3行正在做什么?

number = 1.265
bits = 8
shifted_no = 1.265 * (2** bits)

如果我检查number和shifted_no的结果的二进制格式:

0011 1111 1010 0001 1110 1011 1000 0101
0100 0001 0010 0001 1110 1011 1000 0101

感谢。

2 个答案:

答案 0 :(得分:1)

此处number32-bit floating point。浮点具有以下结构:

+-+--------+-----------------------+
|s|  exp   |       mantisse        |
+-+--------+-----------------------+
 1    8             23

这表示( - 1) 1-2×s ×2 e-127 ×1.m 的值 s s的值, e exp的值和m mantisse的值。

每个组件下面的位数。如果将浮点乘以2的幂,则指数部分将以该幂递增。因此,由于你乘以8(你的问题中可能有一个错误),你用三个增加指数并获得。

原始浮点:

+-+--------+-----------------------+
|0|01111111|01000011110101110000101|
+-+--------+-----------------------+
 1    8             23

最终浮点数:

+-+--------+-----------------------+
|0|10000010|01000011110101110000101|
+-+--------+-----------------------+
 1    8             23

你在这里做的是没有转移。移位意味着您将数据视为一系列位并将其移动到左侧或右侧。无论对该序列的语义解释如何(通常)都这样做。移位通常由<<>>运算符完成。

答案 1 :(得分:1)

如果i是整数,

i * 2**bits

等于

i << bits

举个例子:

>>> 1 * 2**8
256
>>> 1 << 8
256
>>> 2 * 2**8
512
>>> 2 << 8
512

但是没有为浮点数定义<<

>>> 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)是针对任何复数定义的,并且在插入自然数时与阶乘函数一致。请参阅此thread