Расстоянием между двоичными кодами называется количество несовпадающих двоичных разрядов. Например: 0101101 0010101 р=3 ----------- *** Составить функцию Ro (N1,N2), вычисляющую расстояние между двоичными представлениями её целочисленных аргументов N1 N2
Добавлено через 1 мин. желательно написать самый рациональный алгоритм (язык Delphi консольное приложение)
я так понял что на вход подаются 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), если ты действительно хочешь в этом разобраться.