添加'='对Python中的位运算符有什么作用? (即'<< =< =<<<<<"')

时间:2013-04-06 13:35:51

标签: python bitwise-operators

<<=|=运算符对Python意味着什么?我猜他们是按位运算符。我知道运算符|(按位或)和<<(位移),但我不知道它们与=结合使用。

我在this件代码中找到了它。下面的代码属于该代码。

commandout = adcnum
commandout |= 0x18  # start bit + single-ended bit
commandout <<= 3    # we only need to send 5 bits here
for i in range(5):
    if (commandout & 0x80):
        GPIO.output(mosipin, True)
    else:
        GPIO.output(mosipin, False)
    commandout <<= 1
    GPIO.output(clockpin, True)
    GPIO.output(clockpin, False)

2 个答案:

答案 0 :(得分:8)

两者都是就地分配;他们实际上只在name = name op right-hand-expression

的空间中为您提供name op= right-hand-expression

因此,对于您的示例,您可以将其视为:

commandout = commandout | 0x18
commandout = commandout << 3

这有点过于简单了,因为对于这些操作的专用钩子,左手边的物体可以选择做一些特殊的事情; list += rhs实际上是list.extend(rhs),而不是list = list + rhs。就地运算符为可变对象提供了将更改应用于self而非创建新对象的机会。

但是,对于您的示例,我假设commandout是一个int,您有不可变值,而就地操作来返回一个新值。

答案 1 :(得分:2)

那些到位位算术运算符。它们使用与C相同的样式运算符修改LH值(或者将lh值重新分配给新计算值,如果lh是不可变的)。

Python称他们为shifting operators<<>>)和binary bit operators&^|)。

在运算符后添加=后,分配将返回原始LH名称,因此|=执行or<<=执行就地左移。

因此x<<=3x=x<<3相同,或者x位的值向左移动3位。

位移:

>>> b=0x1
>>> b<<=3
>>> bin(b)
'0b1000'

>>> b>>=2
>>> bin(b)
'0b10'

比特或:

>>> bin(b)
'0b1'
>>> bin(c)
'0b100'
>>> c|=b
>>> bin(c)
'0b101'

从技术上讲,如果LH值是不可变的,结果将反弹到LH名称,而不是值的实际就地转换。

这可以通过检查项目的地址来显示:

>>> id(i)
4298178680       # original address (in CPython, id is the address)
>>> i<<=3
>>> id(i)
4298178512       # New id; new int object created

与使用C(在这种情况下,ctypes)不同:

>>> import ctypes
>>> i=ctypes.c_int(1)
>>> ctypes.addressof(i)
4299577040
>>> i.value<<=3
>>> ctypes.addressof(i)
4299577040

由于C整数是可变的,因此位移完成,没有新的C int地址。