![]()  | 
	
 
  | 
| 
		 
			 
			#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;  |