|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
подскажите (двоичная система)
есть задание : на форму поместить 2 едита и одну кнопку (Button),
1)в Edit1 ввести число то 2 млрд до 3 млрд а кнопки запрограммировать так что бы введенное число в Edit1 перевилось в двоичную систему,1 байт этого числа проинвертировался (замена 0 на 1 ,а 1 на 0) 2)в Edit2 должно появиться число в десятичной системе но так, что бы у него вместо 1 проинвертированного байта был бы 3 байт этого числа а вместо 3 - 1 проинвертированный байт Вот пример:2.220.220.220-->10000100.01010101.11011111.00111100-->10000100.01010101.11011111.11000011(инвертированн ый 1 байт) -->10000100.11000011.11011111.01010101(замена им на 3,а 3 на 1)-->2227429205 у меня получилось выполнить 1 часть этого задания т.е. проинвертировать 1 байт, а вот как заменить байты местами я так и не понeл !! вот код который у мене получился : Код:
procedure TForm1.Button1Click(Sender: TObject); var n1,n2:int64; begin n1:=StrToInt64(Edit1.Text); n2:=n1 xor $000000FF; Edit2.Text:=IntToStr(n2); end; lmikle: Напоминаю! пользуемся тегами. За злостные нарушения последует наказание. |
#2
|
|||
|
|||
Ну, в общем случае поменять можно следующим образом.
1. Накладываем маску по OR, где на месте заменяемого байта все единицы, а на месте других байтов - нули. 2. Накладываем маску по AND, где на месте заменяемого байта новые данные, а на всех остальных местах - единицы. Как сформировать вторую маску. 1. Вычленяем нужный байт (отдельно, полученный тип - byte). 2. Берем тим DWORD и присваиваем ему наш байт. 3. Сдвигаем влево на нужное кол-во бит. |
#3
|
|||
|
|||
чё то я не вкатил это как ??
а можеш придложить свой код ну или пример !! |
#4
|
|||
|
|||
Ну, думать лень.
Принцип тот же, что ты использовал в своем коде, где у тебя xor стоит. Я тебе просто пример в двоичном коде приведу (коротком, меняем 2 бита). Код:
N := 01010101; // Исходное число M1 := 00001100; // Первая маска - выделение нужной части. N1 := N AND M1; // Выделили нужное число. N1 = 00000100 N2 := NOT N1; // Инвертировали N2 := 11111011 N21 := N2 AND 00001100; // сбросили ненужны биты. M2 := 11110011; // вторая маска - только обнулили заменяемый кусок N3 := N AND M2; // данные с обнуленном нашим куском N3 = 01010001 N4 := N3 OR N21; // объединили данные N21 и N3. N4 = 01011001 - искомый результат. Естественно, это не готовый код, а демонстрация принципа. Здесь инвертируется некоторый байт не на прямую, а путем его выделения, инвертирования отдельно, а потом вставки обратно. Т.е. нужные данные можно получить любым другим образом. Важен процесс вставки. Я специально использовал только набор базовых операторов (AND, OR, NOT), что бы было понятнее. |