使用 XOR (Python) 的 4 的倍数

Multiple of 4 using XOR (Python)

在不使用 +、-、* 和 % 运算符的情况下检查数字是否为 4 的倍数。

def multipleFour(n):
   if n == 1:
     return False
   XOR = 0
   for i in range(n):
        XOR = XOR ^ 1
   return XOR == n
multipleFour(20)

我的回答returns错

您可以检查二进制文件并避免对从 0n 的所有整数进行异或运算:

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 循环 以及 xor 语句 中弄错了。它应该像 -

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)

即你的循环必须 运行 for i=1 to i=n 而不是 i=0 to i=n-1。而且必须是xor = xor ^ i

编辑:

评论中指出,for i in range(1, n+1)不满足不使用+[=25=的条件], 但是稍微修改一下,这个东西可以解决为 -

def multipleFour(n):
       if n == 1:
         return False
       XOR = n
       for i in range(1, n):
            XOR = XOR ^ i
       return XOR == n
    multipleFour(20)

您的 XOR0 开头,您对它使用的唯一操作是 XOR ^ 1;结果只能是 01。您的代码在 1 上明确 returns False,并且不能在任何更大的数字上 return True;对于 0.

它应该只有 return True

同时,使用 ANDNOT:

可以很容易地检查某个东西是否是 4 "without using +, -, * ,/ and % operators." 的倍数
def multipleFour(n):
    return not(n & 3)