我注意到我可以像 2 << 5
这样做来得到 64 ,以及 1000 >> 2
来得到 250。
同时我也可以在 print
中使用>>
:
print >>obj, "Hello world"
这里发生了什么?
我注意到我可以像 2 << 5
这样做来得到 64 ,以及 1000 >> 2
来得到 250。
同时我也可以在 print
中使用>>
:
print >>obj, "Hello world"
这里发生了什么?
>>
运算符用于两个不同的目的。在 C++ 中,这个运算符被重载了。在第一个例子中,它被用作位运算符(右移),right shift。2 << 5 # shift left by 5 bits
# 0b10 -> 0b1000000
1000 >> 2 # shift right by 2 bits
# 0b1111101000 -> 0b11111010
with open('foo.txt', 'w') as f:
print >>f, 'Hello world' # "Hello world" now saved in foo.txt
这里提到的>>
只适用于Python 2。在Python 3中可以使用file=
参数来重定向print()
的输出:
with open('foo.txt', 'w') as f:
print('Hello world', file=f) # "Hello world" now saved in foo.txt
__rshift__
和 __lshift__
方法覆盖这些运算符。 - trudolf这些是位移操作符。
引用自文档:
x << y
将 x
的二进制位向左移动 y
位(新的右侧位为零)。这与将 x
乘以 2**y
相同。
x >> y
将x
的二进制位向右移动y位后返回结果。与其等价的除法表达式为x
除以2**y
。
print bin(1)
, print bin(1 << 1)
, print bin(17)
, print bin(17 >> 1)
等等。你可以看到它们是如何工作的,无需解释。 - user1472229print >>obj, "Hello world"
。 - Qi Fan2 << 5
和 1000 >> 2
¯_(ツ)_/¯ - James12 << 2
48
在执行上述语句时,十进制数12的二进制表示为“00 1100”,左移2位(即向左移动2个位置)返回值48,其二进制表示为“11 0000”。
48 >> 2
12
在执行上述语句时,十进制数48的二进制表示为“11 0000”,右移2位(即向右移动2个位置)返回值12,其二进制表示为“00 1100”。
位移运算符在许多主流编程语言中都存在,<<
是左移运算符,>>
是右移运算符,可以通过以下表格进行演示,假设一个整数仅占用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 |
print >>obj, "Hello World"
的另一种情况是Python 2中print
语句的“打印chevron”语法(在Python 3中已删除,由print()
函数的file
参数取代)。输出不是写入标准输出,而是传递给obj.write()
方法。 典型示例是具有write()
方法的文件对象。请参阅更近期问题的答案:Python中的双大于号。这些是位运算符的移位操作符
x << y 返回经过左移y位后的x(右边新位上的数字为0)。这与将x乘以2**y相同。
x >> y 返回经过右移y位后的x。这与将x整除2**y相同。
>>> help("symbols")
+-------------------------------------------------+---------------------------------------+
| Operator | Description |
|=================================================|=======================================|
| "<<", ">>" | Shifts |
+-------------------------------------------------+---------------------------------------+
| "&" | Bitwise AND |
+-------------------------------------------------+---------------------------------------+
| "|" | Bitwise OR |
+-------------------------------------------------+---------------------------------------+
| "~x" | bitwise NOT |
+-----------------------------------------------------------------------------------------+
| "^" | Bitwise XOR |
+-------------------------------------------------+---------------------------------------+
x << y
x >> y
注意: 在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'}
将数字2(二进制形式下)向左移动5位(在右侧补0)。
bin(16) # '0b10'
shifted = bin(2) + '0' * 5 # '0b1000000'
int(shifted, 2) # 64
2 << 5 # 64
将1000(二进制)向右移动2位。(在左侧补0)
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
<< 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
<<
、>>
、&
、|
、~
和^
的含义是什么?这些运算符是位运算符,用于操作二进制数字的每一位。具体地说:<<
为左移运算符,将数字的所有位向左移动指定数量的位数,并在右侧添加零。例如,2 << 2 等于 8。>>
为右移运算符,将数字的所有位向右移动指定数量的位数,并在左侧添加零或一(根据数字的符号)。例如,11 >> 1 等于 5。&
为按位与运算符,将两个数字的每一位进行逻辑与运算。只有两个相应的位都为 1 时,结果才为 1。例如, 5 & 3 等于 1。|
为按位或运算符,将两个数字的每一位进行逻辑或运算。只要两个相应的位中至少有一个 1,结果就为 1。例如,5 | 3 等于 7。~
为按位取反运算符,将数字的每一位进行逻辑非运算,即 0 变成 1,1 变成 0。例如,~5 等于 -6。^
为按位异或运算符,将两个数字的每一位进行逻辑异或运算。只有两个相应的位中恰好一个为 1 时,结果才为 1。例如,5 ^ 3 等于 6。