2014-11-30 4 views
5

Я пытаюсь найти решение проблемы, которая задана двумя числами, найти, являются ли они последовательными числами в серой последовательности кода, то есть, если они серого кода, предполагая, что серая кодовая последовательность не упоминается.Как найти, являются ли два числа последовательными числами в последовательности серого кода

Я искал на различных форумах, но не смог получить правильный ответ. Было бы здорово, если бы вы могли предоставить решение для этого.

Моя попытка проблемы - Преобразование двух целых чисел в двоичные и добавление цифр в оба числа отдельно и поиск разницы между суммой цифр в двух числах. Если разница одна, тогда они являются соседями серого кода.

Но я чувствую, что это не будет работать для всех случаев. Любая помощь высоко ценится. Заранее большое спасибо!!!

+2

a и b являются соседними соседями серого кода, если они отличаются только одним битом, то есть если значение XOR b равно 2. –

+1

Обратите внимание, что здесь много кодовых последовательностей Grey. У вас есть определенная последовательность в виду, или вы хотите знать, могут ли два числа быть соседями в последовательности кода _some_ Gray? – ErikR

+0

Большое спасибо за ваши ответы. Можно ли узнать, являются ли заданные два числа серыми соседями кода в некоторой последовательности? Последовательность не была задана в вопросе. Я наткнулся на одно из интервью. Любая помощь приветствуется !!! – user3923643

ответ

-7

Мне тоже пришлось решить этот вопрос в интервью. Одним из условий для двух значений является последовательность серого кода, состоящая в том, что их значения отличаются только на 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 
+0

Большое спасибо за помощь !!! :) – user3923643

+4

Этот ответ неверен. См. [Ответ Морвенна] (http://stackoverflow.com/questions/27218894/how-to-find-if-two-numbers-are-consecutive-numbers-in-gray-code-sequence/27332721#27332721). –

+0

Что не так в моем ответе? –

22

На самом деле, некоторые из других ответов, кажется, не так: это правда, что два двоичной отражение коды Грея соседей отличаются только один бит (я предполагаю, что «на» Грея кодовая последовательность, вы имеете в виду исходную двоичную отраженную последовательность кода Серый, как описано Фрэнком Грей). Однако это не означает, что два кода Grey, отличающиеся одним битом, являются соседями (a => b не означает, что b => a). Например, коды Grey 1000 и 1010 отличаются только одним битом, но не являются соседями (1000 и 1010 соответственно равны 15 и 12 в десятичной форме).

Если вы хотите узнать, являются ли два серых кода a и b соседями, вы должны проверить, previous(a) = b OR next(a) = b. Для данного кода Grey вы получаете одного соседа, переворачивая самый правый бит и другой соседский бит, переворачивая бит слева от самого правого установленного бита. Для кода серого 1010 соседями являются 1011 и 1110 (1000 не является одним из них).

Получите ли вы предыдущий или следующий сосед, перевернув один из этих битов, фактически зависит от четности кода Gray. Однако, поскольку мы хотим обоих соседей, нам не нужно проверять четность. Следующий псевдокод должен вам сказать, являются ли два коды Серые соседи (с использованием C-как битовые операции):

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

Bit Хитрость выше: a & -a изолирует rigthmost набор бит в ряде. Мы сдвигаем этот бит на одну позицию влево, чтобы получить бит, который нам нужно перевернуть.

+2

Удивительное решение. Это лучший из всех и правильный. Хороший человек. –

+0

Основываясь на принятом ответе на https: //math.stackexchange.com/questions/965168/find-the-neighbors-in-gray-code-sequence, ваш псевдокод не сможет пройти через все соседние возможности. Пример двух последовательностей серого кода с одинаковой длиной: [000,001,011,010,110,111,101,100], [000,001,011,111,101,100,110,010]. Код 000 может иметь более двух законных соседей. –

+0

@DiWu Конечно, мой ответ предполагает двоичную отраженную последовательность кода Грея, которая, как правило, тот, о котором люди говорят, когда ничего не указано. – Morwenn

-1

Если вы просто хотите проверить, если входные номера отличаются только один бит:

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; 
} 
1

Предположения: Входы а ​​и б серые кодовые последовательности в двоичном отражается код Грея. . Битовая кодировка 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) -> Истинные (так как (1001, 1011) отличаются только один бит и являются последовательные числа в десятичном представлении)
  • areGrayNeighbors (9,10) -> Ложные
  • areGrayNeighbors (14,10) -> Истинные

Ссылки: метод gTob(), используемый выше, составляет от Rodrigo на этом посту The neighbors in Gray code

-1

Вы можете проверить, если два числа отличаются на один бит или нет следующим образом. В этом методе заботятся о разнице в длине двоичных чисел. Например, вывод для 11 (1011) и 3 (11) будет возвращен как истинный. Кроме того, это не решает второй критерий смежности серого кода. Но если вы только хотите проверить, отличаются ли цифры на один бит, код ниже поможет.

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)); 
    } 
} 
+0

За что голосовать? Я ясно упомянул, что этот метод проверяет только первые критерии. Во время собеседований в технических компаниях меня попросили написать код для этой конкретной задачи, и они не были заинтересованы в точном тесте смежности серого кода. – Aswin

0
public int checkConsecutive2(int b1, int b2){ 
    int x = (b1^b2); 

    if((x & (x - 1)) !=0){ 
     return 0; 
    }else{ 
     return 1; 
    } 

} 
+1

Пожалуйста, добавьте небольшое объяснение, почему вы думаете, что это отвечает на вопрос OP. – iRuth

+0

Вы пытались прочитать и понять принятый ответ и Morwenn's, и почему они оцениваются по-другому? – greybeard

0

Если два числа в серой кодовой последовательности, они отличаются друг от одной двоичной цифры. т. е. исключительное ИЛИ на двух числах возвращает силу 2. Таким образом, найдите XOR и проверьте, является ли результат мощностью двух.

Это решение хорошо подходит для всех тестовых случаев, написанных CodeKaichu выше. Я хотел бы знать, если это не удастся в любом случае.

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

Очевидный ответ, но он работает. Преобразуйте каждый серый код в соответствующую двоичную форму, вычтите два. Если вы отвечаете на двоичный эквивалент +1 или -1, то два серых кода смежны.

Это похоже на убийство, но когда вы сидите в интервью и не знаете правильный метод, это работает. Также для оптимизации можно проверить фильтр с разностной разницей бит, поэтому мы не тратим время на преобразование и вычитание чисел, которые, как мы знаем, не смежны.