Показать сообщение отдельно
  #26  
Старый 06.01.2013, 03:10
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Как то так
Код:
  // Сдвиг
  if ShiftBit <> 0 then
    if ShiftBit < 0 then
      Src := Src shl Abs(ShiftBit)                      // сдвигаем влево на ShiftBit
    else
      Src := Src shr ShiftBit;                          // сдвигаем вправо на ShiftBit

  // Обратный порядок байт
  if CheckBox1.Checked then
  asm
    mov   eax, Src                                      // Загрузить число в аккумулятор
    bswap eax                                           // перевести
    mov   Src, eax                                      // сохранить
  end;

  // Переставить байты
  if CheckBox2.Checked then
  asm
    mov   eax, Src                                      // Загрузить число в аккумулятор
    xchg  al, ah                                        // обменять байты
    ror   eax, 16                                       // вращать на 16 бит
    xchg  al, ah                                        // обменять байты
    ror   eax, 16                                       // вращать на 16 бит
    mov   Src, eax                                      // сохранить
  end;

  // Переставить полубайты
  if CheckBox3.Checked then
  asm
    mov   ecx, 4                                        // счётчик
    mov   eax, Src                                      // Загрузить число в аккумулятор
@_loop:
    ror   al, 4                                         // вращать al на 4 бита
    ror   eax, 8                                        // вращать eax на 8 бит
    loop  @_loop                                        // крутим счётчик
    mov   Src, eax                                      // сохранить
  end;

  // Обратный порядок бит в байтах
  if CheckBox4.Checked then
  asm
    mov eax, Src                                        // Загрузить число в аккумулятор
    xor edx, edx                                        // обнулить edx
    mov ecx, 32                                         // счётчик
@:
    rcr eax, 1                                          // >> выдвигаем крайний бит в CARRY
    rcl edx, 1                                          // << задвигаем из CARRY в крайний бит результата
    loop @, ecx                                         // крутим счётчик
    mov Src, edx                                        // сохранить
  end;

  // Инвертировать
  if CheckBox5.Checked then
  begin
  end;

  // XOR by
  if CheckBox6.Checked and (edtMask.Text <> '') then
  begin
    Mask := HexToDec(edtMask.Text);                     // получаем маску
    Src := Src xor Mask;                                // применяем к числу
  end;

  // удаляем лишние 0
  St := IntToHex(Src, SrcLen);
  if (Length(St) > SrcLen) and (St[Length(St)] = '0') then
    while (Length(St) > SrcLen) and (St[Length(St)] = '0') do
      SetLength(St, Length(St) - 1);
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием