Java 如何确定两个数字是否为格雷码序列中的连续数字

Java 如何确定两个数字是否为格雷码序列中的连续数字,java,python,c,algorithm,gray-code,Java,Python,C,Algorithm,Gray Code,我试图找到一个解决方案,给定两个数,找出它们是否是格雷码序列中的连续数,也就是说,假设没有提到格雷码序列,它们是否是格雷码邻居 我在各种论坛上搜索,但都找不到正确答案。如果您能提供解决方案,那就太好了 我试图解决这个问题-将两个整数转换成二进制,分别将两个数字中的数字相加,然后找出两个数字中的数字之和之间的差。如果差异为1,则它们是格雷码邻居 但我觉得这并不适用于所有情况。非常感谢您的帮助。提前谢谢大家 我也不得不在面试中解决这个问题。两个值成为格雷码序列的条件之一是它们的值仅相差1位。以下是此

我试图找到一个解决方案,给定两个数,找出它们是否是格雷码序列中的连续数,也就是说,假设没有提到格雷码序列,它们是否是格雷码邻居

我在各种论坛上搜索,但都找不到正确答案。如果您能提供解决方案,那就太好了

我试图解决这个问题-将两个整数转换成二进制,分别将两个数字中的数字相加,然后找出两个数字中的数字之和之间的差。如果差异为1,则它们是格雷码邻居


但我觉得这并不适用于所有情况。非常感谢您的帮助。提前谢谢大家

我也不得不在面试中解决这个问题。两个值成为格雷码序列的条件之一是它们的值仅相差1位。以下是此问题的解决方案:

def isGrayCode(num1, num2):
    differences = 0
    while (num1 > 0 or num2 > 0):
        if ((num1 & 1) != (num2 & 1)):
            differences++
        num1 >>= 1
        num2 >>= 1
    return differences == 1

事实上,其他几个答案似乎是错误的:两个二进制反射格雷码邻居只相差一位(我假设«the»Gray code sequence,您指的是Frank Gray所描述的原始二进制反射格雷码序列)。然而,这并不意味着两个相差一位的格雷码是相邻的(
a=>b
并不意味着
b=>a
)。例如,格雷码1000和1010仅相差一位,但不是相邻的(1000和1010分别是十进制的15和12)

如果您想知道两个格雷码
a
b
是否相邻,则必须检查
previous(a)=b还是next(a)=b
。对于给定的格雷码,通过翻转最右边的位获得一个相邻位,通过翻转最右边设置位左侧的位获得另一个相邻位。对于格雷码1010,相邻的是1011和1110(1000不是其中之一)

通过翻转这些位中的一位来获得上一个相邻位还是下一个相邻位实际上取决于格雷码的奇偶性。然而,由于我们想要两个邻居,我们不必检查对等。以下伪代码应该告诉您两个格雷码是否是相邻的(使用类似C的位操作):

函数是\u gray\u近邻(a:gray,b:gray)->布尔值
返回b=a^1或

b=a^((a&-a)如果只想检查输入数字是否相差一位:

public boolean checkIfDifferByOneBit(int a, int b){
    int diff = 0;
    while(a > 0 && b > 0){
        if(a & 1 != b & 1)
            diff++;
        a = a >> 1;
        b = b >> 1;
    }
    if (a > 0 || b > 0) // a correction in the solution provided by David Jones
        return diff == 0 // In the case when a or b become zero before the other
    return diff == 1;
}
假设: 输入a和b是二进制反射格雷码中的格雷码序列。 i、 EA和b的位编码是二进制格雷码表示

#convert from greycode bits into regular binary bits
def gTob(num): #num is binary graycode 
    mask = num >> 1
    while mask!=0:
        num = num^mask
        mask >>= 1
    return num; #num is converted 

#check if a and b are consecutive gray code encodings
def areGrayNeighbors(a,b):
    return abs(gTob(a) - gTob(b)) == 1
很少有测试用例:

  • AreGrayNeights(9,11)->True(因为(10011011)只在一个方面不同 位和是十进制表示的连续数字)
  • Aregray邻居(9,10)-->错误
  • Aregray邻居(14,10)-->正确
参考文献:
上面使用的方法gTob()来自本文中的rodrigo

您可以检查两个数字是否相差一位,如下所示。在该方法中,二进制数长度的差异将得到处理。例如,11(1011)和3(11)的输出将返回为true。 此外,这并不能解决格雷码邻接的第二个标准。但如果您只想检查数字是否相差一位,下面的代码将有所帮助

class Graycode{
    public static boolean graycheck(int one, int two){
        int differences = 0;
        while (one > 0 || two > 0){
            // Checking if the rightmost bit is same
            if ((one & 1) != (two & 1)){
                differences++;
            }
            one >>= 1;
            two >>= 1;
        }
        return differences == 1;
    }
    public static void main(String[] args){
        int one = Integer.parseInt(args[0]);
        int two = Integer.parseInt(args[1]);
        System.out.println(graycheck(one,two));
    }
}

如果两个数字在格雷码序列中,它们相差一个二进制数字。也就是说,两个数字上的异或返回2的幂。因此,找到XOR并检查结果是否为2的幂

这个解决方案适用于上面由CodeKaichu编写的所有测试用例。我很想知道它在任何情况下是否失败

public boolean grayCheck(int x, int y) {
       int z = x^y;
       return (z&z-1)==0;
}

一个显而易见的答案,但它是有效的。 将每个格雷码转换成各自的二进制形式,减去两个。如果答案是+1或-1的二进制等价物,则两个格雷码相邻


这似乎有点过分,但当你在面试时不知道正确的方法时,这是可行的。此外,为了优化,可以检查单位差分过滤器,这样我们就不会浪费时间转换和减去我们确定不相邻的数字。

如果两个数字是灰码序列,它们相差一个二进制数字。即两个数字上的异或返回2的幂。因此,查找XOR并检查结果是否为2的幂

python 3.8

a=int(input())
b=int(input())
x=a^b 
if((x and (not(x & (x - 1))) )):
    print("True")
else:
    print("False")

如果a和b仅在一位上不同,即如果a或b是2的幂,则它们是格雷码邻居。请注意,这里有许多格雷码序列。您是否考虑了特定的序列,或者您想知道在某些格雷码序列中两个数字是否可以是邻居?非常感谢您的回答。是否可以知道给定的两个数字是否为a按某种顺序重新对邻居进行格雷码编码?问题中没有指定顺序。我在一次采访中遇到过。非常感谢任何帮助!!!非常棒的解决方案。这是最好的解决方案,也是正确的解决方案。干得好。根据在接受的答案,你的伪代码无法处理所有邻居的可能性.相同长度的两个格雷码序列示例:[00000 10101111101100],[00000 101111110110010]。代码000可能有两个以上的合法邻居。@迪乌当然,我的答案假设是一个二进制反射的格雷码序列,这通常是人们在没有指定任何内容时所谈论的序列。这个答案是错误的。请参阅。@DavidJones«[…]的确,两个格雷码邻居只相差一位。但是,这并不意味着两个相差一位的格雷码是邻居(
a=>b
并不意味着
b=>a
).»请补充一点解释,说明为什么您认为这回答了OP的问题。您是否尝试阅读并理解了已接受的答案和Morwenn的答案,以及为什么他们的评分不同?反对票是什么?我已经清楚地提到了这一点
public boolean grayCheck(int x, int y) {
       int z = x^y;
       return (z&z-1)==0;
}
a=int(input())
b=int(input())
x=a^b 
if((x and (not(x & (x - 1))) )):
    print("True")
else:
    print("False")