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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 08.01.2012, 21:37   #1
bizkitlimp
Пользователь
 
Регистрация: 17.03.2011
Сообщений: 12
По умолчанию Инвертирование байта (string vs asm vs xor)

И снова клац-клац, темка))
Как инвертировать байт с помощью спец команд(shl,and,xor и т.п.)? Можно и асмом.
Нигде не видел, повсюду биты биты, и то, только один,а мне нужно все 8 разом.

Сейчас инвертирую через строку:
Код:
//Функция перевода из 2 -ого в 16-ое представление
function BinToHex(BinStr: string): string;
const
  BinArray: array[0..15, 0..1] of string =
    (('0000', '0'), ('0001', '1'), ('0010', '2'), ('0011', '3'),
     ('0100', '4'), ('0101', '5'), ('0110', '6'), ('0111', '7'),
     ('1000', '8'), ('1001', '9'), ('1010', 'A'), ('1011', 'B'),
     ('1100', 'C'), ('1101', 'D'), ('1110', 'E'), ('1111', 'F'));
var
  Error: Boolean;
  j: Integer;
  BinPart: string;
begin
  Result:='';

  Error:=False;
  for j:=1 to Length(BinStr) do
    if not (BinStr[j] in ['0', '1']) then
    begin
      Error:=True;
      ShowMessage('This is not binary number');
      Break;
    end;

  if not Error then
  begin
    case Length(BinStr) mod 4 of
      1: BinStr:='000'+BinStr;
      2: BinStr:='00'+BinStr;
      3: BinStr:='0'+BinStr;
    end;

    while Length(BinStr)>0 do
    begin
      BinPart:=Copy(BinStr, Length(BinStr)-3, 4);
      Delete(BinStr, Length(BinStr)-3, 4);
      for j:=1 to 16 do
        if BinPart=BinArray[j-1, 0] then
          Result:=BinArray[j-1, 1]+Result;
    end;
  end;
end;

//Функция перевода из 16 -ого в 2-ое представление
function HexToBin(Hexadecimal: string): string;
 const
   BCD: array [0..15] of string =
     ('0000', '0001', '0010', '0011', '0100', '0101', '0110', '0111',
     '1000', '1001', '1010', '1011', '1100', '1101', '1110', '1111');
 var
   i: integer;
 begin
   for i := Length(Hexadecimal) downto 1 do
     Result := BCD[StrToInt('$' + Hexadecimal[i])] + Result;
 end;


//Инвертирование байта
procedure TForm1.Button1Click(Sender: TObject);
var
s,str:string;
i:integer;
begin
str:=Edit1.text;
s:=hextobin(str[1]+str[2]);
 try
  for i := 1 to 8 do
   if strtoint(s[i]) = 1 then s[i]:='0'
  else s[i]:='1';
finally
 end;
edit2.Text:=bintohex(s);
Вообще ещё хотелось бы узнать, будь инвертирование НЕ через строку, а как-то спец-функциями или пусть через асм, то быстрее будет? (Например, в случае инвертирования целого 10 МБ-ого файла)
bizkitlimp вне форума Ответить с цитированием
Старый 08.01.2012, 21:46   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Код:
var b: Byte;
...
b:=b or 12;
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 08.01.2012, 22:28   #3
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

дык, инвертировать байт целиком:
Код:
var b: Byte;
...
  b := b xor $FF;

а писать это на асме, имхо, бессмыслено - никакого ощутимого выигрыша это не даст...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 08.01.2012, 23:03   #4
bizkitlimp
Пользователь
 
Регистрация: 17.03.2011
Сообщений: 12
По умолчанию

Спасибо, все сработало) Пойду поучу эти xor, or, shl.
что-то мне кажется, по меньшей мере быстрей, чем у меня было бы. у меня вон какой кодище))
bizkitlimp вне форума Ответить с цитированием
Старый 08.01.2012, 23:12   #5
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

это в тысячу раз быстрее.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Инвертирование массива netiv Паскаль, Turbo Pascal, PascalABC.NET 13 04.11.2011 01:32
Одномерный массив, инвертирование Branbal Помощь студентам 6 16.11.2010 09:16
инвертирование строки в C++ MyQwErTy Помощь студентам 2 23.12.2009 22:10
инвертирование(asm80836) NiCola999 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 11 21.11.2009 01:24
инвертирование строки julia23 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 7 12.11.2007 10:36