【问题标题】: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"

这里发生了什么?

【问题讨论】:

标签: python syntax operator-keyword


【解决方案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 框架重载了 '>>' 运算符以指示一个任务在另一个任务的上游:stackoverflow.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¯_(ツ)_/¯
              猜你喜欢
              • 1970-01-01
              • 2010-09-29
              • 2013-05-20
              • 2010-10-23
              • 1970-01-01
              • 2015-02-13
              • 2016-01-09
              • 2016-06-21
              • 2011-08-12
              相关资源
              最近更新 更多