使用XOR(Python)实现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

在不使用+、-、*、/和%运算符的情况下检查数字是否为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 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
,它失败了。按位和with
0x3
直接测试低位(无类型转换)对于
0
,它可以正常工作。不过,为了好玩,您可以通过
strip
ing并确保结果为空:
return not bin(n)[-2:].rstrip('b0')使其工作
hehe,谢谢。我知道有一种更好的方法,我想把它放在那里,因为它清楚地解释了底层的工作原理,没有太多的复杂性。当你发表评论时,我正在寻找合适的按位运算。我修改了答案以反映你的建议。转换为字符串是一种荒谬的方式,而且它在
0
中失败。按位和with
0x3
直接测试低位(无类型转换),并在
0
中正常工作。不过,只是为了好玩,您可以通过
strip
ing使其工作,并确保结果为空:
return not bin(n)[-2:]rstrip('b0')
hehe,谢谢。我知道有更好的方法,我想把它放在那里,因为它清楚地解释了底层的工作原理,没有太多的复杂性。当你发表评论时,我正在寻找合适的按位运算。我修改了答案以反映你的建议。这是一个非常巧妙的算法,我不知道(在实际代码中使用将是荒谬的)。然而……
i+1
似乎在作弊:P仍然+1,因为它教会了我一个新东西,并且比我们其他人更好地回答了字面上的问题这使用
+
来计算
范围的结尾,因此它违反了规则。但是您可以通过将
XOR
初始化为
n
而不是
0
来修复它