![]() |
|
#1
|
|||
|
|||
![]() Всем привет.
Передо мной встала задача. Из слова 01110101 1-нужный бит. 0-незначащий разряд. Необходимо выбрать нужные биты и составить из них отдельный код. Помогите пожалуйста. |
#2
|
|||
|
|||
![]() Непонятна задача в части "составить".
Выделить значение - наложить маску. Код:
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
|
|||
|
|||
![]() Именно из этих нужных битов составить новое слово. То есть есть приведённый мной выше код в котором картину портят биты, которые просто не используются для вычисления. Мне нужно взять только используемые биты и из них получить слово. Если ещё точнее то в исходном слове лежит переменная в такой вот дурацкой кодировке, где есть биты, которые почему то не используются для вычисления. Надо их вычленить из кода в отдельную переменную.
Последний раз редактировалось killbit, 17.10.2015 в 23:17. |
#4
|
|||
|
|||
![]() Нашёл как можно сделать для данной ситуации. Получается
Tyhhff.code and $F0. Shr 3; То есть через чистое наложение маски. Код на самом деле 32 разряда. Исходя из этого какой код я должен записать до слова begin чтобы всё зароботало |
#5
|
|||
|
|||
![]() Не понтно, что же тебе действительно надо сделать. Сбросить в 0 ненужные биты? Или убрать их вообще из данных (т.е. было 32 бита, не нужны, например, 8, после убирания остается 24)? Опиши задачу более детально.
Кстати, в принципе, ничто не мешает накладывать 32-разрядную маску за исключением того, что ее описывать не очень удобно... |
#6
|
|||
|
|||
![]() Подробно выглядит так: есть код, состоящий из 32 разрядов. Для вычисления параметра используются разряды 9-14 и 16-18. Остальные для вычисления не используются. Соответственно нужно для правильного вычисления взять два диапозона разрядов и поставить их рядом и сместить в начало. Также 19 разряд знаковый. Результат должен получиться в дополнительном коде.
|
#7
|
||||
|
||||
![]() Код:
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; Пишу программы за еду. __________________ |
#8
|
||||
|
||||
![]() Если ничего не напутал, то можно вот так еще сделать:
Код:
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; Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. |