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

Delphi Sources



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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 16.10.2015, 20:48
killbit killbit вне форума
Прохожий
 
Регистрация: 16.10.2015
Сообщения: 6
Версия Delphi: delphi 6
Репутация: 10
По умолчанию биты из слова

Всем привет.
Передо мной встала задача.
Из слова
01110101
1-нужный бит.
0-незначащий разряд.
Необходимо выбрать нужные биты и составить из них отдельный код.
Помогите пожалуйста.
Ответить с цитированием
  #2  
Старый 17.10.2015, 18:22
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,087
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Непонятна задача в части "составить".
Выделить значение - наложить маску.
Код:
const
  cBit = 1; // 00000001
var
  I : Integer;
  B : Byte;
  Bt : Byte;
begin
  B := 117; // 01110101
  For I := 0 To 7 Do
    begin
      Bt := B and cBit; // значение правого бита текущего значения, I - его номер 0..7
      B := B shr 1; // сдвигаем на 1 вправо
    end;
Ответить с цитированием
  #3  
Старый 17.10.2015, 23:01
killbit killbit вне форума
Прохожий
 
Регистрация: 16.10.2015
Сообщения: 6
Версия Delphi: delphi 6
Репутация: 10
По умолчанию

Именно из этих нужных битов составить новое слово. То есть есть приведённый мной выше код в котором картину портят биты, которые просто не используются для вычисления. Мне нужно взять только используемые биты и из них получить слово. Если ещё точнее то в исходном слове лежит переменная в такой вот дурацкой кодировке, где есть биты, которые почему то не используются для вычисления. Надо их вычленить из кода в отдельную переменную.

Последний раз редактировалось killbit, 17.10.2015 в 23:17.
Ответить с цитированием
  #4  
Старый 02.11.2015, 18:26
killbit killbit вне форума
Прохожий
 
Регистрация: 16.10.2015
Сообщения: 6
Версия Delphi: delphi 6
Репутация: 10
По умолчанию

Нашёл как можно сделать для данной ситуации. Получается
Tyhhff.code and $F0.
Shr 3;
То есть через чистое наложение маски.
Код на самом деле 32 разряда. Исходя из этого какой код я должен записать до слова begin чтобы всё зароботало
Ответить с цитированием
  #5  
Старый 02.11.2015, 20:25
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,087
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Не понтно, что же тебе действительно надо сделать. Сбросить в 0 ненужные биты? Или убрать их вообще из данных (т.е. было 32 бита, не нужны, например, 8, после убирания остается 24)? Опиши задачу более детально.

Кстати, в принципе, ничто не мешает накладывать 32-разрядную маску за исключением того, что ее описывать не очень удобно...
Ответить с цитированием
  #6  
Старый 03.11.2015, 11:01
killbit killbit вне форума
Прохожий
 
Регистрация: 16.10.2015
Сообщения: 6
Версия Delphi: delphi 6
Репутация: 10
По умолчанию

Подробно выглядит так: есть код, состоящий из 32 разрядов. Для вычисления параметра используются разряды 9-14 и 16-18. Остальные для вычисления не используются. Соответственно нужно для правильного вычисления взять два диапозона разрядов и поставить их рядом и сместить в начало. Также 19 разряд знаковый. Результат должен получиться в дополнительном коде.
Ответить с цитированием
  #7  
Старый 03.11.2015, 12:07
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

Код:
var
  mask: DWORD;
  src: DWORD;
  dst: DWORD;
  i: Integer;

  function IntToBinStr(dw: DWORD): string;
  var
    i: Integer;
  begin
    Result:='';
    for i:=1 to 32 do
    begin
      Result:=IntToStr(dw and 1)+Result;
      dw:=dw shr 1;
    end;
  end;

begin
  mask:=$5200F421;
  src:=$6755ED0B;
  dst:=0;
  Edit1.Text:=IntToBinStr(mask);
  Edit2.Text:=IntToBinStr(src);
  for i:=1 to 32 do
  begin
    if (mask and $80000000)<>0 then
    begin
      dst:=dst shl 1;
      if (src and $80000000)<>0 then dst:=dst or 1;
    end;
    mask:=mask shl 1;
    src:=src shl 1;
  end;
  Edit3.Text:=IntToBinStr(dst);
end;
работает с DWORD
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #8  
Старый 04.11.2015, 12:07
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,723
Репутация: 52347
По умолчанию

Если ничего не напутал, то можно вот так еще сделать:
Код:
var
  Dig: LongWord;
  D1,D2: LongWord;
begin
 asm
  mov Dig, 00000000000001111011111100000000b
 end;
 D1 := (Dig shr 15) shl 6;
 D2 := (Dig shl 18) shr 26;
 Dig := D1 or D2;
 WriteLn(Dig);
end;
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

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