怎么做>>和<<用Python表示?

时间:2014-04-03 08:59:05

标签: python syntax operator-keyword

我注意到我可以执行2 << 5之类的操作来获得64而1000 >> 2可以获得250。

我也可以在>>中使用print

print >>obj, "Hello world"

这里发生了什么?

11 个答案:

答案 0 :(得分:36)

这些是按位移位运算符。

引用docs

x << y

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

x >> y

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

答案 1 :(得分:24)

我认为这是一个重要的问题而且尚未得到解答(OP似乎已经了解了移位运营商)。让我试着回答一下,&gt;&gt;您的示例中的运算符用于两个不同的目的。在c ++术语中,此运算符被重载。在第一个示例中,它用作按位运算符(左移),而在第二个示例中,它仅用作输出重定向。即。

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

例如

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

更新

在python 3中,可以直接给出file参数:

{{1}}

答案 2 :(得分:9)

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

答案 3 :(得分:8)

  
    
      

12 << 2

             

48

    
  

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

  
    
      

48 >> 2

             

12

    
  

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

答案 4 :(得分:5)

这些是shift operators

  

x&lt;&lt; y返回x,位置向左偏移y位(和   右侧的新位为零。这是一样的   将x乘以2 ** y。

     

x&gt;&gt; y返回x,位移到   在y的地方。这与//“x by 2 ** y”相同。

答案 5 :(得分:1)

它们是许多主流编程语言中都存在的位移运算符,<<是左移,>>是右移,它们可以证明如下表,假设整数仅取内存中有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 |

答案 6 :(得分:1)

这些是按位移位运算符。

4 << 4 这与x乘以2 y相同。**

2 ** 4

16 * 4

64

121 >> 4

这与将x除以2 y相同。**

121 // 2

60 // 2

30 // 2

15 // 2

7

答案 7 :(得分:0)

<< 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

答案 8 :(得分:0)

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

我确实打印了(100<<3) 将 100 转换为二进制会得到 1100100。 我所做的是我删除了前 3 位并在末尾添加了 3 位值为“0”。 所以结果应该是 0100000,我把它转换成十进制,结果是 32。

令我惊讶的是,当我执行 print(100<<3) 时,答案是 800。我很困惑。 我将 800 转换为二进制以检查发生了什么。 这就是我得到的 1100100000。

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

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

看起来像 (100<<3) ,左移运算符在 Python 上有一个错误。

答案 9 :(得分:0)

<块引用>

是“按位”运算符。 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'}

答案 10 :(得分:0)

2 << 5(左移)

向左移动 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