python 中的位移位
Bit shifting in python
我想看懂下面的代码。第 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
谢谢。
这里number
是一个32-bit floating point。浮点数具有以下结构:
+-+--------+-----------------------+
|s| exp | mantisse |
+-+--------+-----------------------+
1 8 23
这表示一个值(-1)1-2×s×2e-127×1.m 和 s s
的值,e exp
的值和m
mantisse
.
的值
每个组件下面的位数。如果将浮点数乘以 2 的幂,则指数部分随该幂递增。因此,由于您乘以八(您的问题中可能存在错误),因此您将指数增加三并获得。
原始浮点数:
+-+--------+-----------------------+
|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
但是 <<
没有为浮点数定义:
>>> 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.
我想看懂下面的代码。第 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
谢谢。
这里number
是一个32-bit floating point。浮点数具有以下结构:
+-+--------+-----------------------+
|s| exp | mantisse |
+-+--------+-----------------------+
1 8 23
这表示一个值(-1)1-2×s×2e-127×1.m 和 s s
的值,e exp
的值和m
mantisse
.
每个组件下面的位数。如果将浮点数乘以 2 的幂,则指数部分随该幂递增。因此,由于您乘以八(您的问题中可能存在错误),因此您将指数增加三并获得。
原始浮点数:
+-+--------+-----------------------+
|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
但是 <<
没有为浮点数定义:
>>> 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.