Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 10.03.2009, 17:16
Toten Toten вне форума
Прохожий
 
Регистрация: 10.03.2009
Сообщения: 2
Репутация: 10
Восклицание подскажите (двоичная система)

есть задание : на форму поместить 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  
Старый 10.03.2009, 17:32
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,048
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Ну, в общем случае поменять можно следующим образом.
1. Накладываем маску по OR, где на месте заменяемого байта все единицы, а на месте других байтов - нули.
2. Накладываем маску по AND, где на месте заменяемого байта новые данные, а на всех остальных местах - единицы.

Как сформировать вторую маску.
1. Вычленяем нужный байт (отдельно, полученный тип - byte).
2. Берем тим DWORD и присваиваем ему наш байт.
3. Сдвигаем влево на нужное кол-во бит.
Ответить с цитированием
  #3  
Старый 11.03.2009, 14:00
Toten Toten вне форума
Прохожий
 
Регистрация: 10.03.2009
Сообщения: 2
Репутация: 10
По умолчанию

чё то я не вкатил это как ??
а можеш придложить свой код ну или пример !!
Ответить с цитированием
  #4  
Старый 11.03.2009, 16:13
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,048
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Ну, думать лень.
Принцип тот же, что ты использовал в своем коде, где у тебя 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), что бы было понятнее.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 01:53.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter