Python 3.x 逐位运算

Python 3.x 逐位运算,python-3.x,bitwise-operators,bit-shift,Python 3.x,Bitwise Operators,Bit Shift,这是第一次使用python中的位操作,而且(对我来说)语法也很奇怪 对于上下文,set_只是一个由4个字母组成的列表 这里有一点需要解开。首先,我从未见过[set(),set()]。我一定是使用了错误的关键字,因为我在文档中找不到它。看起来它在蟒蛇中创造了一个矩阵,但我不能肯定。第二,虽然部分[i&1]是一个切片操作,但我不完全确定为什么需要按位操作。例如,0&1应该是1,1&1应该是0(携带1),那么二进制10(或十进制中的2)?最后,最后一个按位操作完全令人困惑。我相信右移等于除以二(我希望

这是第一次使用python中的位操作,而且(对我来说)语法也很奇怪

对于上下文,set_只是一个由4个字母组成的列表

这里有一点需要解开。首先,我从未见过
[set(),set()]
。我一定是使用了错误的关键字,因为我在文档中找不到它。看起来它在蟒蛇中创造了一个矩阵,但我不能肯定。第二,虽然
部分[i&1]
是一个切片操作,但我不完全确定为什么需要按位操作。例如,0&1应该是1,1&1应该是0(携带1),那么二进制10(或十进制中的2)?最后,最后一个按位操作完全令人困惑。我相信右移等于除以二(我希望如此),但为什么
I>>=1
?我不知道该怎么解释。任何指导都将不胜感激

我从未见过[set(),set()]

这并不是什么有趣的事情,只是一个包含两个新集合的列表。您已经看到了,因为它不是新语法。只是一个列表和构造函数

parts[i&1]
这将测试
i
的最低有效位,并选择
部分[0]
(如果lsb为0)或
部分[1]
(如果lsb为1)。没有什么比切片更奇特的了,只是将简单的旧索引放入列表中。你得到的东西是一个集合,
.add(item)
做了一件显而易见的事情:向选中的集合添加一些东西

但是为什么
i>>=1
?我不知道该怎么解释

i
中的位向右移动一个位置,放下旧的lsb,保留符号。有点像这样

当然,在Python中有任意精度的整数,所以它需要多长,而不是8位

对于正数,有关复制符号的部分无关紧要

您可以将右移1视为地板除以2(这与截断不同,负数向负无穷大舍入,例如
-1>>1=-1
),但这种解释通常更复杂

无论如何,这里使用的方法只是一种循环通过
i
位的方法,从低到高逐个测试它们,但不是改变它测试的位,而是每次将它想要测试的位移动到相同的位置

我从未见过[set(),set()]

这并不是什么有趣的事情,只是一个包含两个新集合的列表。您已经看到了,因为它不是新语法。只是一个列表和构造函数

parts[i&1]
这将测试
i
的最低有效位,并选择
部分[0]
(如果lsb为0)或
部分[1]
(如果lsb为1)。没有什么比切片更奇特的了,只是将简单的旧索引放入列表中。你得到的东西是一个集合,
.add(item)
做了一件显而易见的事情:向选中的集合添加一些东西

但是为什么
i>>=1
?我不知道该怎么解释

i
中的位向右移动一个位置,放下旧的lsb,保留符号。有点像这样

当然,在Python中有任意精度的整数,所以它需要多长,而不是8位

对于正数,有关复制符号的部分无关紧要

您可以将右移1视为地板除以2(这与截断不同,负数向负无穷大舍入,例如
-1>>1=-1
),但这种解释通常更复杂

无论如何,这里使用的方法只是一种循环通过
i
的位的方法,从低到高逐个测试它们,但不是改变它测试的位,而是每次将它想要测试的位移动到相同的位置。

[set(),set()]
创建一个由两个空集组成的列表

0&1是0,1&1是1。位运算中没有进位<因此,当
i
为偶数时,code>parts[i&1]指第一组,当
i
为奇数时,指第二组

i>=1
右移一位(实际上等于除以二),然后将结果分配回
i
。这与使用
i+=1
增加变量的基本概念相同

内部循环的作用是根据
i
的位,将
\u集的元素划分为两个子集。如果外部循环中的限制只是
2**len(_set)
,那么代码将生成所有可能的分区。但是,由于这个限制被二除,只有一半的可能分区被生成——如果没有更多的上下文,我猜不出这有什么意义。

[set(),set()]
创建了一个由两个空集组成的列表

0&1是0,1&1是1。位运算中没有进位<因此,当
i
为偶数时,code>parts[i&1]
指第一组,当
i
为奇数时,指第二组

i>=1
右移一位(实际上等于除以二),然后将结果分配回
i
。这与使用
i+=1
增加变量的基本概念相同


内部循环的作用是根据
i
的位,将
\u集的元素划分为两个子集。如果外部循环中的限制只是
2**len(_set)
,那么代码将生成所有可能的分区。但是,由于该限制被二除,只有一半可能的分区被生成——如果没有更多的上下文,我猜不出这有什么意义。

哇,太棒了!非常感谢你!一个障碍似乎是使用位操作来完成事情,而我通常会尝试将事情保持在十进制,让位操作在引擎盖下发生,并且不在视线范围内。