Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Закрытая тема
Ваша тема закрыта, почему это могло произойти? Возможно,
Нет наработок или кода, если нужно готовое решение - создайте тему в разделе Фриланс и оплатите работу.
Название темы включает слова - "Помогите", "Нужна помощь", "Срочно", "Пожалуйста".
Название темы слишком короткое или не отражает сути вашего вопроса.
Тема исчерпала себя, помните, один вопрос - одна тема
Прочитайте правила и заново правильно создайте тему.
 
Опции темы Поиск в этой теме
Старый 26.07.2012, 10:55   #1
Tronix
Форумчанин
 
Аватар для Tronix
 
Регистрация: 15.06.2010
Сообщений: 740
По умолчанию В слове (16bit) заменить 4-бита

Привет, чет меня заклинило на, казалось бы, простейшей вещи:
Допустим есть слово (16 bit): $F1E1
Мне нужно поменять предпоследние 4 бита в нем (там где сейчас $E) на, допустим $3, чтобы стало $F131

Щаз реализовал примерно таким говнокодом:
Код:
Uses SysUtils;
Var
   i,j : Word;

function ReverseWord(w: word): word;
asm
   xchg   al, ah
end;

Begin
   j := $f1e1;
   i := 3;
   writeln(inttohex(j,4));  // F1E1

   j := reverseword(j);     // переводим из little-endian в big-endian
   writeln(inttohex(j,4));  // E1F1
   j := j shl 4;
   writeln(inttohex(j,4));  // 1F10
   j := j shr 4;
   writeln(inttohex(j,4));  // 01F1
   i := i shl 12;               // i := 3000
   j := j or i;             
   writeln(inttohex(j,4));  // 31F1
   j := reverseword(j);
   writeln(inttohex(j,4));  // F131
   readln;

End.
На такой странный "пошаговый" код не смотрите, пишу на ассемблере, просто воспроизвожу на паскале. Вышеуказанный код работает, но уж как-то очень много телодвижений приходится совершать, наверняка я просто туплю и можно все гораздо проще сделать. Как?
Чтобы понять рекурсию, сперва нужно понять рекурсию.
Tronix вне форума
Старый 26.07.2012, 11:29   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

обычные битовые AND и OR Вас чем то не устраивают?

вот так, например:
Код:
procedure TForm1.Button1Click(Sender: TObject);
Var
   i,j : Word;
begin
   j := $f1e1;
   Memo1.Lines.Append('$'+IntToHex(j,4));
   j := (j and $FF0F) or $30;
   Memo1.Lines.Append('$'+IntToHex(j,4))
end;
Serge_Bliznykov вне форума
Старый 26.07.2012, 11:31   #3
Tronix
Форумчанин
 
Аватар для Tronix
 
Регистрация: 15.06.2010
Сообщений: 740
По умолчанию

Да, старость не в радость. Сам догадался за минуту до этого поста, спасибо. Тема закрыта.
Чтобы понять рекурсию, сперва нужно понять рекурсию.
Tronix вне форума
Закрытая тема


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
изменение бита в числе Kukurudza Общие вопросы C/C++ 5 25.10.2011 23:16
Проверка установленности 0-го бита Sianukvil Общие вопросы C/C++ 0 01.06.2010 17:09
Число размером 1024 бита. ImmortalAlexSan Общие вопросы Delphi 1 16.04.2010 12:54
C++ получение конкретного бита... SNUPY Помощь студентам 2 26.03.2009 18:50
Замена второго бита в числе SZR Помощь студентам 4 25.01.2008 20:16