<<=
和|=
运算符对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)
答案 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<<=3
与x=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地址。