powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Рекурентное задание кодов Грея
14 сообщений из 14, страница 1 из 1
Рекурентное задание кодов Грея
    #38390874
Жмурик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Как по предыдущему коду Грея вычислить следующий?

BinToGray(), фигурирующий в форумах, выполняет другую задачу - преобразование номера в код.
Мне нужно код - в следующий код.

Спасибо.
...
Рейтинг: 0 / 0
Рекурентное задание кодов Грея
    #38390972
Фотография lLocust
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Жмурик,

приходит в голову решение в лоб:

newGray = BinToGray ( GrayToBin( oldGray )+1 )

)))
...
Рейтинг: 0 / 0
Рекурентное задание кодов Грея
    #38391006
Жмурик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Мне в лоб это тоже пришло
Но GrayToBin довольно громоздко
Неужели нет чего попроще GrayToNextGray() !
...
Рейтинг: 0 / 0
Рекурентное задание кодов Грея
    #38391063
Фотография lLocust
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Жмурик,

Если честно не встречал.
Алгоритм то придумать можно, но он вряд ли будет быстрее чем GrayToBin. Там цикл по N разрядам числа, все операции бинарные. Задачка действительно требует повышения производительности на мс?
...
Рейтинг: 0 / 0
Рекурентное задание кодов Грея
    #38391297
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Возможно термин "рекуррентно" знесь применяется неправильно? У меня первая мысль была
что для известного отображения однобитного кода Грея.

xy0011

Мы рекуррентно определяем код более высокой разрядности. Для двух бит.
...
Рейтинг: 0 / 0
Рекурентное задание кодов Грея
    #38391622
Жмурик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
lLocust - пока пользуюсь Вашим методом.
Вполне устраивает.

Просто хотелось красоты, Вы меня понимаете?


mayton - рекурентное задание последовательности - это зависимость ее членов от конечного числа предыдущих.
Типа An = f(An-1). (Я не сомневаюсь, что это Вам известно)
В моем случае это вычислить очередной член последовательности кодов Грея на основе предыдущего кода.
В рамках одной и той же разрядности. Например 32 бита.
...
Рейтинг: 0 / 0
Рекурентное задание кодов Грея
    #38392120
Жмурик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Кому интересно - внимание, правильный ответ!

В этой статье приводится алгоритм инкремента кодов Грея, реализованный на Java.
...
Рейтинг: 0 / 0
Рекурентное задание кодов Грея
    #38393073
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А кому лень всё читать - вот собственно вычисление следующего кода
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
    /** Вычисляет следующее значение кода Грея в последовательности после предыдущего. Этот статический
     * метод просто выполняет некоторые манипуляции с битами; ему не надо делать ничего особенного с
     * Logisim, за исключением того, что он манипулирует с объектами Value и BitWidth. */
    static Value nextGray(Value prev) {
        BitWidth bits = prev.getBitWidth();
        if(!prev.isFullyDefined()) return Value.createError(bits);
        int x = prev.toIntValue();
        int ct = (x >> 16) ^ x; // вычислить соотношение для x
        ct = (ct >> 8) ^ ct;
        ct = (ct >> 4) ^ ct;
        ct = (ct >> 2) ^ ct;
        ct = (ct >> 1) ^ ct;
        if((ct & 1) == 0) { // если соотношение чётное, то поменять первый бит
            x = x ^ 1;
        } else { // иначе поменять бит сразу выше последней 1
            int y = x ^ (x & (x - 1)); // сначала вычислить последнюю 1
            y = (y << 1) & bits.getMask();
            x = (y == 0 ? 0 : x ^ y);
        }
        return Value.createKnown(bits, x);
    }
...
Рейтинг: 0 / 0
Рекурентное задание кодов Грея
    #38404426
Жмурик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот еще вариант ((с) rsdn):

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
def isGrayEven(n):
    count = 0
    while n:
        if n & 1: count ++
        n >>= 1
    return (count % 2 == 0)

def getLesserOne(n):
    return n & ~(n-1)

def getNextGray(n):
    if isGrayEven(n):
        return n ^ 1
    return n ^ (getLesserOne(n) << 1)
...
Рейтинг: 0 / 0
Рекурентное задание кодов Грея
    #38404431
Жмурик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Только что это за язык?
...
Рейтинг: 0 / 0
Рекурентное задание кодов Грея
    #38405136
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЖмурикТолько что это за язык?Python
...
Рейтинг: 0 / 0
Рекурентное задание кодов Грея
    #38405143
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
UsmanЖмурикТолько что это за язык?Python
Код: sql
1.
2.
3.
4.
5.
6.
$ python g.py
  File "g.py", line 4
    if n & 1: count ++
                     ^
SyntaxError: invalid syntax
$
...
Рейтинг: 0 / 0
Рекурентное задание кодов Грея
    #38405185
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owl,

Вы очень точно заметили. Постфиксного инкремента (как и префиксного) в Питоне не существует.
Корректировочка к исходнику - нужно заменить count++ на count += 1 .
...
Рейтинг: 0 / 0
Рекурентное задание кодов Грея
    #38407814
Жмурик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Usman,

Да, это я виноват, подумал, что это C или C++...
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Рекурентное задание кодов Грея
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]