如何在灰色代码序列中查找两个数字是否是连续数字[英] How to find if two numbers are consecutive numbers in gray code sequence

本文是小编为大家收集整理的关于如何在灰色代码序列中查找两个数字是否是连续数字的处理方法,想解了如何在灰色代码序列中查找两个数字是否是连续数字的问题怎么解决?如何在灰色代码序列中查找两个数字是否是连续数字问题的解决办法?那么可以参考本文帮助大家快速定位并解决问题。

问题描述

我试图提出一个给定两个数字的问题的解决方案,发现它们是否是灰色代码序列中的连续数字,即假定未提及灰色代码序列的灰色代码邻居.

我在各种论坛上搜索,但无法得到正确的答案.如果您可以为此提供解决方案,那就太好了.

我对问题的尝试 - 将两个整数转换为二进制,并分别添加两个数字,并在两个数字中找到数字总和之间的差异.如果差异是一个,那么它们是灰色代码邻居.

,但我觉得这对所有情况都无法使用.任何帮助都受到高度赞赏.预先感谢!!!

推荐答案

我也必须在采访中解决这个问题.两个值为灰色代码序列的条件之一是它们的值仅差异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

其他推荐答案

实际上,其他几个答案似乎是错误的:两个二进制反射的灰色代码邻居的确只有一点点(我假设«»»灰色代码序列,您如Frank Gray所述,是指原始二进制反射灰色代码序列.但是,这并不意味着两个灰色代码不同的是邻居(a => b并不意味着b => a).例如,灰色代码1000和1010只有一位不同,但不是邻居(1000和1010分别为15和12,十进制为15和12).

如果您想知道两个灰色代码a和b是邻居,则必须检查previous(a) = b OR next(a) = b是否.对于给定的灰色代码,您可以通过翻转最右边的最右边的位和另一个邻居的位来获得一个邻居,从而在最右侧的位左侧翻转位.对于灰色代码1010,邻居是1011和1110(1000不是其中之一).

通过翻转这些位之一来获得上一个邻居还是下一个邻居,实际上取决于灰色代码的奇偶校验.但是,由于我们想要两个邻居,因此我们不必检查平等.以下伪代码应告诉您两个灰色代码是否是邻居(使用类似于C的Bitwise操作):

function are_gray_neighbours(a: gray, b: gray) -> boolean
    return b = a ^ 1 OR
           b = a ^ ((a & -a) << 1)
end

位上以上:a & -a在数字中隔离最固定的位.我们将该位转移到左侧一个位置,以获取我们需要翻转的位.

其他推荐答案

假设: 输入A和B是二进制反射的灰色代码中的灰色代码序列. 即A和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

很少的测试用例:

  • aregrayneighbors(9,11) - > true (因为(1001,1011)仅在一个方面有所不同 位和十进制表示中的连续数字)
  • aregrayneighbors(9,10) - > false
  • aregrayneighbors(14,10) - > true

参考: 上面使用的方法gtob()在这篇文章中来自罗德里戈(Rodrigo)灰色代码中的邻居/p>

本文地址:https://www.itbaoku.cn/post/359112.html