我在python中找到了一个代码示例,我理解了代码,但有一行我不知道为什么这样编写:
c = 1
c = (c + 1) & 255
Run Code Online (Sandbox Code Playgroud)
我知道它将变量C的值增加到一个,但我不明白 & 255
任何人都可以向我解释一下吗?
c当代码达到256时,此代码执行的操作将重置为零,因此顺序为:
1 -> 2 -> 3 -> ... -> 254 -> 255 -> 0 -> 1 -> ...
Run Code Online (Sandbox Code Playgroud)
这是另一种写作方式:
c = (c + 1) % 256
Run Code Online (Sandbox Code Playgroud)
思考这个问题的方法之一是,% 256限制了结果的范围0... 255.
请注意,& 255唯一有效的因为256是2的幂,而使用模数运算符的公式适用于任何数字.
该&运营商是一个位和.结果中的每个位都是1当且仅当两个参数中的相应位都是时1.我们来看一些例子:
>>> a = 10 # 0b1010
>>> b = 12 # 0b1100
>>> bin(a & b)
0b1000
>>> a = 300 # 0b100101100
>>> b = 255 # 0b011111111
>>> bin(a & b)
'0b101100'
Run Code Online (Sandbox Code Playgroud)
你可能已经注意到255是0b011111111,并且方式&有效,这意味着结果将与另一个参数具有相同的最后8位,而没有其他位.
这是通过"翻转"并忽略任何溢出来屏蔽值以适合字节(8位无符号整数)的好方法.您可以类似地使用31或65535将值屏蔽为nybble或单词.
所以,这段代码:
c = (c + 1) & 255
Run Code Online (Sandbox Code Playgroud)
...意味着我们将其c视为一个字节,递增它,并翻转并忽略任何溢出.*
如果c确实代表一些以这种方式起作用的低级字节导向值,这可能是一件很有用的事情,比如一个LED计数器,它循环通过256个位置并在RPi板上从头开始.
在C中,有些人使用它作为快捷方式,% 256即使该值实际上并不意味着代表一个字节,只是因为它给出了相同的结果,至少在20世纪70年代的硬件上,它的速度要快得多.但在C on 2015硬件上,它可能实际上并不快.而在Python中,它几乎肯定不是.(事实上,从快速测试来看,它稍微慢了 ......但它也非常接近,即使这不是测量误差,你也永远不会关心.)
所以,如果你看到有人把它写成Python中的"优化",那么你应该把他们的解释器带走,然后让他们用汇编语言工作一周,直到他们克服它.
*正如sapi在对NPE答案的评论中指出的那样,将其写成& 0xFF或者可能更清楚& 0b11111111,因为其中任何一个更明显是最高字节值255.
| 归档时间: |
|
| 查看次数: |
103 次 |
| 最近记录: |