How to find if two numbers are consecutive numbers in gray code sequence

后端 未结 9 1095
醉梦人生
醉梦人生 2021-02-04 18:44

I am trying to come up with a solution to the problem that given two numbers, find if they are the consecutive numbers in the gray code sequence i.e., if they are gray code neig

相关标签:
9条回答
  • 2021-02-04 18:55

    Assumptions: Inputs a and b are grey code sequences in binary reflected gray code. i.e a's and b's bit encoding is binary gray code representations.

    #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
    

    Few Test cases:

    • areGrayNeighbors(9,11) --> True (since (1001, 1011) differ in only one bit and are consecutive numbers in decimal representation)
    • areGrayNeighbors(9,10) --> False
    • areGrayNeighbors(14,10) --> True

    References: method gTob() used above is from rodrigo in this post The neighbors in Gray code

    0 讨论(0)
  • 2021-02-04 19:01

    If two numbers are in gray code sequence, they differ by one binary digit. i.e the exclusive OR on the two numbers returns a power of 2. So, find XOR and check if the result is a power of two.

    This solution works well for the all the test cases written by CodeKaichu above. I would love to know if it fails in any cases.

    public boolean grayCheck(int x, int y) {
           int z = x^y;
           return (z&z-1)==0;
    }
    
    0 讨论(0)
  • 2021-02-04 19:01

    If two numbers are in gray code sequence, they differ by one binary digit. i.e the exclusive OR on the two numbers returns a power of 2. So, find XOR and check if the result is a power of two.

    python 3.8

    a=int(input())
    b=int(input())
    x=a^b 
    if((x and (not(x & (x - 1))) )):
        print("True")
    else:
        print("False")
    
    0 讨论(0)
  • 2021-02-04 19:03

    I've had to solve this question in an interview as well. One of the conditions for the two values to be a gray code sequence is that their values only differ by 1 bit. Here is a solution to this problem:

    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
    
    0 讨论(0)
  • 2021-02-04 19:09

    If you just want to check if the input numbers differ by just one bit:

    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;
    }
    
    0 讨论(0)
  • 2021-02-04 19:12

    Actually, several of the other answers seem wrong: it's true that two binary reflected Gray code neighbours differ by only one bit (I assume that by « the » Gray code sequence, you mean the original binary reflected Gray code sequence as described by Frank Gray). However, that does not mean that two Gray codes differing by one bit are neighbours (a => b does not mean that b => a). For example, the Gray codes 1000 and 1010 differ by only one bit but are not neighbours (1000 and 1010 are respectively 15 and 12 in decimal).

    If you want to know whether two Gray codes a and b are neighbours, you have to check whether previous(a) = b OR next(a) = b. For a given Gray code, you get one neighbour by flipping the rightmost bit and the other neighbour bit by flipping the bit at the left of the rightmost set bit. For the Gray code 1010, the neighbours are 1011 and 1110 (1000 is not one of them).

    Whether you get the previous or the next neighbour by flipping one of these bits actually depends on the parity of the Gray code. However, since we want both neighbours, we don't have to check for parity. The following pseudo-code should tell you whether two Gray codes are neighbours (using C-like bitwise operations):

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

    Bit trick above: a & -a isolates the rigthmost set bit in a number. We shift that bit by one position to the left to get the bit we need to flip.

    0 讨论(0)
提交回复
热议问题