使用XOR(Python)实现4的倍数
在不使用+、-、*、/和%运算符的情况下检查数字是否为4的倍数使用XOR(Python)实现4的倍数,python,xor,Python,Xor,在不使用+、-、*、/和%运算符的情况下检查数字是否为4的倍数 def multipleFour(n): if n == 1: return False XOR = 0 for i in range(n): XOR = XOR ^ 1 return XOR == n multipleFour(20) 我的答案返回False您可以检查二进制,避免将所有整数从0异或到n: 0 0000 1 0001 2 0010 3 0011 4 0100 8
def multipleFour(n):
if n == 1:
return False
XOR = 0
for i in range(n):
XOR = XOR ^ 1
return XOR == n
multipleFour(20)
我的答案返回False您可以检查二进制,避免将所有整数从
0
异或到n
:
0 0000
1 0001
2 0010
3 0011
4 0100 8 1000 12 1100
四的倍数的二进制签名是'00'
def x_of_4(n):
return bin(n)[-2:] == '00'
然而,尽管转换为字符串使其易于可视化和理解,但这并不是最好的想法,而且这种方法在n=0
中失败一个更好的方法是按位和3,这将测试二进制表示的最后两个零(注释中的@ShadowRanger:
def x_of_4(n):
return not n & 3
您可以检查二进制并避免将所有整数从
0
异或到n
:
0 0000
1 0001
2 0010
3 0011
4 0100 8 1000 12 1100
四的倍数的二进制签名是'00'
def x_of_4(n):
return bin(n)[-2:] == '00'
然而,尽管转换为字符串使其易于可视化和理解,但这并不是最好的想法,而且这种方法在n=0
中失败一个更好的方法是按位和3,这将测试二进制表示的最后两个零(注释中的@ShadowRanger:
def x_of_4(n):
return not n & 3
您在for循环以及异或语句中出错。它应该类似于-
def multipleFour(n):
if n == 1:
return False
XOR = 0
for i in range(1, n+1):
XOR = XOR ^ i
return XOR == n
multipleFour(20)
i、 e.循环必须在i=1到i=n之间运行,而不是在i=0到i=n-1之间运行。循环必须是xor=xor^i
编辑:
正如在评论中指出的,对于范围(1,n+1)中的i,不满足不使用+的条件,但是只要稍加修改,这个问题就可以如下解决:-
def multipleFour(n):
if n == 1:
return False
XOR = n
for i in range(1, n):
XOR = XOR ^ i
return XOR == n
multipleFour(20)
您在for循环以及异或语句中出错。它应该类似于-
def multipleFour(n):
if n == 1:
return False
XOR = 0
for i in range(1, n+1):
XOR = XOR ^ i
return XOR == n
multipleFour(20)
i、 e.循环必须在i=1到i=n之间运行,而不是在i=0到i=n-1之间运行。循环必须是xor=xor^i
编辑:
正如在评论中指出的,对于范围(1,n+1)中的i,不满足不使用+的条件,但是只要稍加修改,这个问题就可以如下解决:-
def multipleFour(n):
if n == 1:
return False
XOR = n
for i in range(1, n):
XOR = XOR ^ i
return XOR == n
multipleFour(20)
您的
XOR
以0
开始,您对其使用的唯一操作是XOR^1
;结果只能是0
或1
。您的代码在1
上显式返回False
,在任何较大的数字上都不能返回True
;它应该只返回True
对于0
同时,使用和和而不是可以很容易地检查某个值是否是4的倍数,而不使用+、-、*、/和%运算符
def multipleFour(n):
return not(n & 3)
您的XOR
以0
开始,您对其使用的唯一操作是XOR^1
;结果只能是0
或1
。您的代码在1
上显式返回False
,在任何较大的数字上都不能返回True
;它应该只返回True
对于0
同时,使用和和而不是可以很容易地检查某个值是否是4的倍数,而不使用+、-、*、/和%运算符
def multipleFour(n):
return not(n & 3)
您是否需要使用xor,或者其他按位运算符是否可以接受?通常,您需要使用掩码(按位and,&
)和逻辑求反(not
)来测试这一点。返回not n&0x3
(或返回n&0x3==0
)将覆盖您,不需要xor(在C运算符优先级中,您需要添加paren,返回!(n&0x3);
,但Python更自然地设置了位运算符和布尔运算符的优先级,因此不需要paren)。因此,(x^3)-x==3
,但不需要减法……嗯……您需要使用xor,还是可以接受其他位运算符?通常,您需要使用掩码(按位and,&
)和逻辑求反来测试这一点(not
).return not n&0x3
(或return n&0x3==0
)将覆盖您,不需要xor(在C运算符优先级中,您需要添加paren,return!(n&0x3);
,但Python会更自然地设置位运算符和布尔运算符的优先级,因此不需要paren)。(x^3)-x==3,但没有减法…嗯…转换成字符串是一种荒谬的方法,对于0
,它失败了。按位和with0x3
直接测试低位(无类型转换)对于0
,它可以正常工作。不过,为了好玩,您可以通过strip
ing并确保结果为空:return not bin(n)[-2:].rstrip('b0')使其工作
hehe,谢谢。我知道有一种更好的方法,我想把它放在那里,因为它清楚地解释了底层的工作原理,没有太多的复杂性。当你发表评论时,我正在寻找合适的按位运算。我修改了答案以反映你的建议。转换为字符串是一种荒谬的方式,而且它在0
中失败。按位和with0x3
直接测试低位(无类型转换),并在0
中正常工作。不过,只是为了好玩,您可以通过strip
ing使其工作,并确保结果为空:return not bin(n)[-2:]rstrip('b0')
hehe,谢谢。我知道有更好的方法,我想把它放在那里,因为它清楚地解释了底层的工作原理,没有太多的复杂性。当你发表评论时,我正在寻找合适的按位运算。我修改了答案以反映你的建议。这是一个非常巧妙的算法,我不知道(在实际代码中使用将是荒谬的)。然而……i+1
似乎在作弊:P仍然+1,因为它教会了我一个新东西,并且比我们其他人更好地回答了字面上的问题这使用+
来计算范围的结尾,因此它违反了规则。但是您可以通过将XOR
初始化为n
而不是0
来修复它