我正在尝试打印数组的所有子集。我在解决方案中遇到过这个if语句。 如果有条件怎么办?
if((计数器&(1 << j))> 0):
答案 0 :(得分:1)
您的声明:
if ( (counter & (1 << j)) > 0 ):
这是一些按位操作。让我们分解一下:
(1 << j)
生成数字0b1
并将其向左移j
位-j
必须是整数。这类似于说2**j
,或者说第j
的2次幂,但是使用移位运算符<<
可以使我们清楚地知道我们正在执行按位运算。counter & (1 << j)
接受最后一次操作的结果,并对变量and
进行按位counter
运算。看来j
是位掩码的说明符-它指出在counter
中签入哪个位很重要。由于(1 << j)
产生的任何东西在其二进制表示形式中将只包含一个1
,因此表达式counter & (1 << j)
将始终产生2或0的幂。> 0
检查生成的数字是否为0。总而言之,这是一种相当复杂的方法,用于检查j
右边第counter
位是否等于1
或0
。没有看到其余的代码,就无法分辨该行在上下文中的作用,但是希望这能给您足够的提示,以帮助您解决所有问题。
答案 1 :(得分:1)
&运算符是按位运算符。更多信息here。
基本上,如果我们将计数器视为二进制文件:
counter = 0b0010
1 << j -> with j = 0
j将是您要使用1评估的职位。
因此,在这种情况下,由于AND运算符将返回0,因此不会执行IF语句。
但是:
counter = 0b0010
1 << j -> with j = 1
将执行IF语句,因为AND运算符将返回1。
要了解更多信息,可以使用以下代码并更改counter和j的值:
counter = 0b0100
j = 2
if((counter & (1 << j)) > 0):
print("True")
else:
print("False")