>> 和 << 在 Python 中是啥意思?
Posted
技术标签:
【中文标题】>> 和 << 在 Python 中是啥意思?【英文标题】:What do >> and << mean in Python?>> 和 << 在 Python 中是什么意思? 【发布时间】:2014-05-14 23:39:04 【问题描述】:我注意到我可以通过 2 << 5
获得 64 和 1000 >> 2
获得 250 等操作。
我也可以在print
中使用>>
:
print >>obj, "Hello world"
这里发生了什么?
【问题讨论】:
FAQ: What do the operators<<
, >>
, &
, |
, ~
, 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 << y
返回 x 并将位向左移动 y 位(右侧的新位为零)。这与将 x 乘以 2**y 相同。
x >> 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,因此您可能会看到它用作特定包的各种重定向。 (这是有道理的,因为>>
通常表示操作系统中的输出重定向和附加)【参考方案7】:
它们是许多主流编程语言中存在的位移运算符,<<
是左移,>>
是右移,可以如下表所示,假设一个整数在内存中只占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 >>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 << 1)
、print bin(17)
、print bin(17 >> 1)
等等。您无需解释即可查看其工作原理。
位移运算符需要 2 个操作数,那么为什么操作数是“打印”而操作数 2 是对象?如print >>obj, "Hello world"
这是对 OP 提供的上下文的回答(因此 OP 知道),而不是对所提出的问题的回答。
@Qi Fan @z33k 在编写此答案一年多后,对该问题进行了编辑以添加要打印的参考。原来的问题只提到了2 << 5
和1000 >> 2
¯_(ツ)_/¯以上是关于>> 和 << 在 Python 中是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章