IPB
ЛогинПароль:

> ВНИМАНИЕ!

Прежде чем задать вопрос, смотрите FAQ.
Рекомендуем загрузить DRKB.

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

> Задача на расстояние между двоичными кодами, Помогите с решением плииз
сообщение
Сообщение #1


Новичок
*

Группа: Пользователи
Сообщений: 38
Пол: Мужской

Репутация: -  0  +


Расстоянием между двоичными кодами называется количество несовпадающих двоичных разрядов. Например:
0101101
0010101 р=3
-----------
***
Составить функцию Ro (N1,N2), вычисляющую расстояние между двоичными представлениями её целочисленных аргументов N1 N2

Добавлено через 1 мин.
желательно написать самый рациональный алгоритм (язык Delphi консольное приложение)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
сообщение
Сообщение #2


Гость






Цитата
я так понял что на вход подаются 2 числа типа Integer. Как перейти к битам?
Число типа Integer - это 32-битное (для Дельфи) целое, правда? И хранится оно в двоичном коде. Скажем, 12 представлено в памяти как 00000000000000000000000000001100, а 13 - как 00000000000000000000000000001101. Так вот, это все - биты, как ты уже догадался, потому как их ровно 32. Теперь, как получить доступ к отдельным битам: проще всего использовать операцию "Битовый AND", которая берет и делает их побитное "умножение" (ну да, And - умножение, а Or - сложение, так уж повелось): (0 and 0) = (0 and 1) = (1 and 0) = 0, и только если оба бита равны 1, то и результат операции And будет единичным: (1 and 1) = 1...

Еще не догадался, как получить содержимое самого младшего бита в числе? Правильно, надо это число "умножить" на маску, состоящую из всех 0, и одной единицы, в том бите, который мы проверяем... Тогда без разницы, что было в первых 31 битах, там после And-а все равно будут нули, а вот состояние последнего бита, маска которого содержит 1, мы узнаем...

Вот и делаем:
00000000000000000000000000001100
and
00000000000000000000000000000001
=
00000000000000000000000000000000 = 010, то есть в числе 12 младший бит НЕ установлен. А в числе 13 - установлен, поэтому
00000000000000000000000000001101
and
00000000000000000000000000000001
=
00000000000000000000000000000001 = 110.

Теперь о том, что значит
inc(res, (n1 and $1) xor (n2 and $1));

(n1 and $1) - это выявление младшего бита первого числа
(n2 and $1) - младший бит второго числа

XOR - еще одна битовая операция, которая возвращает: (1 xor 0) = (0 xor 1) = 1,
а при равных битах: (0 xor 0) = (1 xor 1) = 0, то есть, если младшие биты обоих чисел НЕодинаковы, то
(n1 and $1) xor (n2 and $1) будет = 1. Если одинаковы - будет равно 0... Ну, и последний этап: просто увеличиваем счетчик на это число, если биты разные, счетчик увеличится на 1, если одинаковые - счетчик увеличится на 0, а значит, ничего не изменится... Это то, что и нужно - подсчитывать - то надо те биты, которые различаются...

Ну, и после того, как младшие биты проверены, надо оба числа сдвинуть вправо, чтобы проверить новую пару бит, это и делается через
n1 := n1 shr 1; n2 := n2 shr 1;
- битовый сдвиг на 1 вправо... Проверяем таким образом все 32 пары бит, и в переменной Res имеем число несовпадающих бит в числах.

Тебе надо почитать о битовых операциях (OR, AND, XOR, NOT, SHR, SHL), если ты действительно хочешь в этом разобраться.
 К началу страницы 
+ Ответить 

Сообщений в этой теме
Lodar'   Задача на расстояние между двоичными кодами   28.01.2009 22:08
volvo   Желательно пользоваться поиском, кстати: задача на…   28.01.2009 23:06
Lodar'   тот алгоритм на кторый вы дали ссылку мне не очень…   28.01.2009 23:19
Lodar'   Вот прога которую я написал. но она почему то не р…   29.01.2009 2:14
volvo   Рабочий? Да. Рациональный? Нет... Поскольку речь ш…   29.01.2009 2:14
Lodar'   ну я так понял что на вход подаются 2 числа типа I…   29.01.2009 2:21
amega   непроще воспользоватся inttoBin функцией, или ее в…   29.01.2009 2:23
Lodar'   непроще воспользоватся inttoBin функцией ну я не…   29.01.2009 2:31
Lodar'   и еще огромная просьба обьяснить ту рациональную ф…   29.01.2009 3:02
Lodar'   мне если можно то побыстрее) завтра уже сдавать(((…   29.01.2009 3:37
volvo   Число типа Integer - это 32-битное (для Дельфи) це…   29.01.2009 3:38
Lodar'   Спасибо большое! а мою прогу можете исправить?…   29.01.2009 3:50
volvo   Ну, знаешь, это как-то не наши проблемы. Сам дотян…   29.01.2009 4:08
Lodar'   ой спасибо) а вот ворпос (n1 and $1) что здес…   29.01.2009 4:10
Lodar'   и непонятно что вот это за строчка еще FillChar(r…   29.01.2009 4:35
volvo   Вообще-то $ перед числом означает, что это чи…   29.01.2009 7:43
Lodar'   Cпасибо большое! я разобрался)))) вы мне очень…   29.01.2009 14:07
Lodar'   Хм...а с отрицательными числами будет прога работа…   30.01.2009 0:50
volvo   Моя функция (ссылка во втором посте) - будет, твоя…   30.01.2009 1:39
Lodar'   =)) твой вариант несовсем прокатил на экзамене(( п…   1.02.2009 15:17
мисс_граффити   хммм... а ничего, что там xor и делается? и как ты…   2.02.2009 7:00
Lodar'   Вы меня не поняли....я имел ввиду только XOR не в …   7.02.2009 15:10
volvo   "Рациональнее" - это когда что-то меняет…   8.02.2009 14:54


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 19.05.2024 20:23
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name