Python:为什么右移>&燃气轮机;四舍五入,应该在哪里使用?

Python:为什么右移>&燃气轮机;四舍五入,应该在哪里使用?,python,operators,Python,Operators,我从未使用过>和3输出12,而不是12.5。这是为什么。也许学习在哪里最好地使用右移可以间接地回答这个问题,但我很好奇。和右移不是划分 让我们看看到底是什么,它会变得清晰 首先,回想一下,一个数字作为二进制数字的集合存储在内存中。如果我们有8位内存,我们可以将2位存储为00000010,将5位存储为00000101 右移将这些数字移到右边。例如,将上述两位数字右移一将分别给出00000001和00000010 请注意,最低的数字(right-most)完全从末尾移出,对最终结果没有影响。位移动一

我从未使用过
>
pcode100>3
输出
12
,而不是
12.5
。这是为什么。也许学习在哪里最好地使用右移可以间接地回答这个问题,但我很好奇。

右移不是划分

让我们看看到底是什么,它会变得清晰

首先,回想一下,一个数字作为二进制数字的集合存储在内存中。如果我们有8位内存,我们可以将2位存储为
00000010
,将5位存储为
00000101

右移将这些数字移到右边。例如,将上述两位数字右移一将分别给出
00000001
00000010


请注意,最低的数字(right-most)完全从末尾移出,对最终结果没有影响。

位移动一个整数会得到另一个整数。例如,数字12以二进制形式写入为0b1100。如果我们向右移位1,我们得到0b110=6。如果我们按2移位,我们得到0b11=3。最后,如果我们将比特移位3,我们得到0b1=1,而不是1.5。这是因为移位到寄存器之外的位丢失


一种简单的方法是将位向右移动N,这与将结果除以2^N,然后截断结果相同。

其他答案解释了位移动的概念,但这里具体介绍了100>>3的情况

100
128 64 32 16 8 4 2 1
  0  1  1  0 0 1 0 0 = 100
100 >> 1
128 64 32 16 8 4 2 1
  0  0  1  1 0 0 1 0  = 50
100 >> 2
128 64 32 16 8 4 2 1
  0  0 0  1  1 0 0 1  = 25
100 >> 3
128 64 32 16 8 4 2 1
  0  0  0  0 1 1 0 0  = 12
你不需要经常使用它,除非你需要一些非常快的2除法,但即使如此,也不要使用它。这使得代码比需要的复杂得多,而且速度的差异是不明显的

如果您使用的是二进制数据,那么您需要使用它的主要时间是,您特别需要将位移位。我唯一真正使用它的是读写ID3标记,它以7位字节存储大小信息,如下所示:

0xxxxxxx 0xxxxxxx 0xxxxxxx 0xxxxxxx.
需要像这样组合在一起:

0000xxxx xxxxxxxx xxxxxxxx xxxxxxxx

在内存中给出一个普通整数。

只需展开一点,100在二进制中表示为01100100,右移3位后为000011100,即12。@Anon谢谢。一、 不用说,我不知道二进制是如何从文本构造的(反之亦然),但我认为
2肯定不是巧合。首先要注意的是,二进制的构造与十进制相似,我们只是使用了不同的基数,所以我们使用了一、二、四、八等,而不是一、十、百、千等。左移位在功能上等同于2的乘法,就像在基数为10的数字末尾加零在功能上等同于10的乘法一样。@orukusaki:换一种说法,您的示例可以重新描述为
y,谢谢您提供的信息。那很有趣。
0000xxxx xxxxxxxx xxxxxxxx xxxxxxxx