>> 和 << 在 Python 中是啥意思?

Posted

技术标签:

【中文标题】>> 和 << 在 Python 中是啥意思?【英文标题】:What do >> and << mean in Python?>> 和 << 在 Python 中是什么意思? 【发布时间】:2014-05-14 23:39:04 【问题描述】:

我注意到我可以通过 2 &lt;&lt; 5 获得 64 和 1000 &gt;&gt; 2 获得 250 等操作。

我也可以在print 中使用&gt;&gt;

print >>obj, "Hello world"

这里发生了什么?

【问题讨论】:

FAQ: What do the operators &lt;&lt;, &gt;&gt;, &amp;, |, ~, and ^ do? 在这里,现在您可以将这些符号插入搜索引擎并让它实际搜索它们:symbolhound.com Bitwise Operation and Usage 的可能副本 @user2357112 这真的很有帮助,谢谢。对于那些说这是一个基本问题的人来说,它可能是,但我没有按位运算符的概念,所以我从来没有想过在文档中查找它...... @joaquin 现在是 google 中 Python 大于大于的第一结果。 【参考方案1】:

2

将 2(二进制)左移 5 位。 (向右注入零)

bin(16) # '0b10'

shifted = bin(2) + '0' * 5 # '0b1000000'

int(shifted, 2) # 64
2 << 5 # 64

1000 >> 2(右移)

将 1000(二进制)向右移动 2 位。 (向左注入零)

bin(1000) # '0b1111101000'

# add 00 to the left and remove last digit from the right
# '0b 00(add these bits) 11111010 00(remove these bits)'
shifted = '0b0011111010'

int(shifted, 2) # 250
1000 >> 2 # 250

【讨论】:

【参考方案2】:

是“按位”运算符。 https://wiki.python.org/moin/BitwiseOperators

>>> help("symbols")

+-------------------------------------------------+---------------------------------------+
| Operator                                        | Description                           |
|=================================================|=======================================|
| "<<", ">>"                                      | Shifts                                |
+-------------------------------------------------+---------------------------------------+
| "&"                                             | Bitwise AND                           |
+-------------------------------------------------+---------------------------------------+
| "|"                                             | Bitwise OR                            |
+-------------------------------------------------+---------------------------------------+
| "~x"                                            | bitwise NOT                           |
+-----------------------------------------------------------------------------------------+
| "^"                                             | Bitwise XOR                           |
+-------------------------------------------------+---------------------------------------+

x &lt;&lt; y 返回 x 并将位向左移动 y 位(右侧的新位为零)。这与将 x 乘以 2**y 相同。

x &gt;&gt; y 返回 x,其中的位向右移动了 y 位。这与 //'ing x by 2**y 相同。

PD: 在 python 3.9 中,运算符 " | " 应用于字典合并字典。

https://docs.python.org/3.9/whatsnew/3.9.html

>>> x = "key1": "value1 from x", "key2": "value2 from x"
>>> y = "key2": "value2 from y", "key3": "value3 from y"
>>> x | y
'key1': 'value1 from x', 'key2': 'value2 from y', 'key3': 'value3 from y'
>>> y | x
'key2': 'value2 from x', 'key3': 'value3 from y', 'key1': 'value1 from x'

【讨论】:

【参考方案3】:

我在 Python 2.7 和 Python 3.8 上都验证了以下内容

我打印了(100

令我惊讶的是,当我执行 print(100

如果您看到 800 是 Python 的答案,它们并没有移动或删除前 3 位,而是将值“0”添加到最后 3 位。

作为 print(100>>3) ,工作完美。我进行了手动计算并检查了 python 的打印结果。它工作正常。删除最后 3 位并将值“0”添加到前 3 位。

看起来像 (100

【讨论】:

没有错误,只是不限于每个数字 8 位。 > 操作符都应该使用相同的逻辑。但是 @Nandish 为什么...它们都使用相同的逻辑工作【参考方案4】:
<< Mean any given number will be multiply by 2the power
for exp:- 2<<2=2*2'1=4
          6<<2'4=6*2*2*2*2*2=64

【讨论】:

【参考方案5】:

12

48

当我们执行上述语句时,12的实际二进制值为“00 1100”左移(左移2位)返回值48,其二进制值为“11 0000”。

48 >> 2

12

48的二进制值为“11 0000”,执行上述语句后右移(右移2位)返回值12其二进制值为“00 1100”。

【讨论】:

【参考方案6】:

我认为这是一个重要的问题,但尚未得到回答(OP 似乎已经知道移位运算符)。让我尝试回答,您示例中的 >> 运算符用于两个不同的目的。在 c++ 术语中,此运算符是重载的。在第一个示例中,它用作按位运算符(左移),而在第二个场景中,它仅用作输出重定向。即

2 << 5 # shift to left by 5 bits
2 >> 5 # shift to right by 5 bits
print >> obj, "Hello world" # redirect the output to obj, 

示例

with open('foo.txt', 'w') as obj:
    print >> obj, "Hello world" # hello world now saved in foo.txt

更新:

在 python 3 中,可以直接给出 file 参数,如下所示:

print("Hello world", file=open("foo.txt", "a")) # hello world now saved in foo.txt

【讨论】:

仅供参考,您可能在 Python 代码中看到的右移运算符的另一个常见用法将出现在 Airflow 文件中。 Airflow 框架重载了 '>>' 运算符以指示一个任务在另一个任务的上游:***.com/questions/52389105/… 您实际上可以通过__rshift____lshift__ 方法覆盖这些运算符。 我知道 2 >> 5 等于 0。我认为它应该等于 0.0001? @teter123f 操作是二进制的。这不是十进制运算。 Python 3 的更新很好,但没有提到在 Python 3 中不再可能使用双 V 形来重定向 print,因为 print 变成了一个函数而不是语句 by本身。其他对象可以通过实现自己的__rshift____lshift__ 来重载双V,因此您可能会看到它用作特定包的各种重定向。 (这是有道理的,因为&gt;&gt; 通常表示操作系统中的输出重定向和附加)【参考方案7】:

它们是许多主流编程语言中存在的位移运算符,&lt;&lt;是左移,&gt;&gt;是右移,可以如下表所示,假设一个整数在内存中只占1个字节.

| operate | bit value | octal value |                       description                        |
| ------- | --------- | ----------- | -------------------------------------------------------- |
|         | 00000100  |           4 |                                                          |
| 4 << 2  | 00010000  |          16 | move all bits to left 2 bits, filled with 0 at the right |
| 16 >> 2 | 00000100  |           4 | move all bits to right 2 bits, filled with 0 at the left |

【讨论】:

正好在找这个解释。【参考方案8】:

涉及print &gt;&gt;obj, "Hello World" 的另一种情况是Python 2 中print 语句 的“print chevron”语法(在Python 3 中被删除,替换为@987654325 的file 参数@函数)。不是写入标准输出,而是将输出传递给obj.write() 方法。一个典型的例子是具有write() 方法的文件对象。查看最近一个问题的答案:Double greater-than sign in Python。

【讨论】:

【参考方案9】:

这些是shift operators

x

x >> y 返回 x 并将位移到 就在y个地方。这与 //'ing x by 2**y 相同。

【讨论】:

【参考方案10】:

这些是移位运算符。

引用docs:

x << y

返回x,并将位向左移动 y 位(右侧的新位为零)。这与将x 乘以2**y 相同。

x >> y

返回x,位右移y位。这与将x 除以2**y 相同。

【讨论】:

也许举个例子会有所帮助,在 Python 中键入一系列这些:print bin(1)print bin(1 &lt;&lt; 1)print bin(17)print bin(17 &gt;&gt; 1) 等等。您无需解释即可查看其工作原理。 位移运算符需要 2 个操作数,那么为什么操作数是“打印”而操作数 2 是对象?如print &gt;&gt;obj, "Hello world" 这是对 OP 提供的上下文的回答(因此 OP 知道),而不是对所提出的问题的回答。 @Qi Fan @z33k 在编写此答案一年多后,对该问题进行了编辑以添加要打印的参考。原来的问题只提到了2 &lt;&lt; 51000 &gt;&gt; 2¯_(ツ)_/¯

以上是关于>> 和 << 在 Python 中是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章

python 基础之字符编码和文件处理

爬虫第三章 模拟登录

Python学习02:基本数据类型

找BUG

多态和封装

>> 和 << 在 Python 中是啥意思?