使用XOR(Python)的4个中的多个

时间:2017-11-30 01:34:49

标签: 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)

我的回答是假的

3 个答案:

答案 0 :(得分: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)

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

编辑:

正如评论中所指出的,对于范围内的i(1,n + 1)不符合不使用 + 的条件,但通过一点修改,事情可以解决 -

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

答案 1 :(得分:3)

XOR0开头,您使用的唯一操作是XOR ^ 1;结果只能是01。您的代码在False上显式返回1,并且无法在任何较大的数字上返回True;它只应返回True的{​​{1}}。

同时,很容易检查是否有4"而不使用+, - ,*,/和%运算符。",使用0和{{1} }:

AND

答案 2 :(得分:2)

您可以检查二进制文件并避免将0n的所有整数进行xoring:

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的方法失败了。
更好的方法做同样的事情是 bitwise-and-with 3 ,这将测试二进制表示的最后两个零(在评论中归功于@ShadowRanger:< / p>

def x_of_4(n):
    return not n & 3