Страница 1 из 1

Частный случай с оператором XOR. Нужна помощь.

СообщениеДобавлено: 02.01.2016 17:44:11
ANTIKLAN
Всем привет!
Подскажите пожалуйста как сделать операцию вида 1010010101 xor 0100101011, если два этих числа записаны как строковые переменные? И второй вопрос поймет ли компилятор что это двоичные числа самостоятельно или нужно делать перевод в двоичную систему? Если да, то как? Если не трудно пример наглядный продемонстрируйте.

Re: Частный случай с оператором XOR. Нужна помощь.

СообщениеДобавлено: 02.01.2016 17:54:32
Снег Север
Перевести ваши строки в LongInt функцией StrToInt. Выполнить операцию xor и перевести результат в строку функцией binStr. Так компилятор поймет... :D

Re: Частный случай с оператором XOR. Нужна помощь.

СообщениеДобавлено: 03.01.2016 01:26:52
ANTIKLAN
Снег Север писал(а):Перевести ваши строки в LongInt функцией StrToInt. Выполнить операцию xor и перевести результат в строку функцией binStr. Так компилятор поймет... :D

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

Re: Частный случай с оператором XOR. Нужна помощь.

СообщениеДобавлено: 03.01.2016 01:44:52
скалогрыз
ANTIKLAN писал(а):Если не трудно пример наглядный продемонстрируйте.


Демонстрирую!
Код: Выделить всё
function EpicXOR(const a,b: string): string;
var
  i: integer;
  r: string;
begin
  R:='';
  for i:=length(a) downto 1 do begin
    if a[i]=b[i] then r:='0'+r
    else r:='1'+r;
  end;
  EpicXor:=r;
end;

var
  a,b: string;
begin
  readln(a);
  readln(b);
  writeln(EpicXor(a,b));
end.

Здесь есть недоделки, которые ты тебе следует исправить самостоятельно.
В приведённом тобой частном случае, всё работает успешно.

Re: Частный случай с оператором XOR. Нужна помощь.

СообщениеДобавлено: 03.01.2016 10:47:54
daesher
ANTIKLAN писал(а):И еще я не нашел пока что информации как пользоваться функцией BinStr.

BinStr хорош, если знаешь длину числа. Можно набросать свои, например, такие. Идеологически это правильно
Код: Выделить всё
function StrToBin(const S:String):qword;
var
  i: Integer;
begin
  Result:=0;
  for i:=1 to Length(S) do
  case s[i] of
    '1':Result:=Result*2+1;
    '0':Result:=Result*2;
    ' ':continue;
  else raise EFormatError.Create('Invalid binary in string');
  end;
end;

function BinToStr(w:qword):string;
var
  N: QWord;
begin
  if w=0 then begin Result:='0';exit;end;
  N:=w;
  Result:='';
  repeat
    if (N mod 2)=1 then Result:='1'+Result else Result:='0'+Result;
    N:=N div 2;
  until N=0;
end;                     


Приложен простейший проект, демонстрирующий перевод

Re: Частный случай с оператором XOR. Нужна помощь.

СообщениеДобавлено: 03.01.2016 14:18:12
ANTIKLAN
скалогрыз писал(а):
ANTIKLAN писал(а):Если не трудно пример наглядный продемонстрируйте.


Демонстрирую!
Код: Выделить всё
function EpicXOR(const a,b: string): string;
var
  i: integer;
  r: string;
begin
  R:='';
  for i:=length(a) downto 1 do begin
    if a[i]=b[i] then r:='0'+r
    else r:='1'+r;
  end;
  EpicXor:=r;
end;

var
  a,b: string;
begin
  readln(a);
  readln(b);
  writeln(EpicXor(a,b));
end.

Здесь есть недоделки, которые ты тебе следует исправить самостоятельно.
В приведённом тобой частном случае, всё работает успешно.

Спасибо за пример. Я правда в нем почти ничего не понял. Но буду разбираться.

daesher писал(а):
ANTIKLAN писал(а):И еще я не нашел пока что информации как пользоваться функцией BinStr.

BinStr хорош, если знаешь длину числа. Можно набросать свои, например, такие. Идеологически это правильно
Код: Выделить всё
function StrToBin(const S:String):qword;
var
  i: Integer;
begin
  Result:=0;
  for i:=1 to Length(S) do
  case s[i] of
    '1':Result:=Result*2+1;
    '0':Result:=Result*2;
    ' ':continue;
  else raise EFormatError.Create('Invalid binary in string');
  end;
end;

function BinToStr(w:qword):string;
var
  N: QWord;
begin
  if w=0 then begin Result:='0';exit;end;
  N:=w;
  Result:='';
  repeat
    if (N mod 2)=1 then Result:='1'+Result else Result:='0'+Result;
    N:=N div 2;
  until N=0;
end;                     


Приложен простейший проект, демонстрирующий перевод

Ваши примеры более понятны мне. Непонятно одно. Почему Result*2? И второе я могу использовать эти функции в программе "как есть"?

Re: Частный случай с оператором XOR. Нужна помощь.

СообщениеДобавлено: 03.01.2016 21:00:52
Снег Север
ANTIKLAN писал(а):Так я пробовал это не будет числом в двоичной системе это будет огромное число в десятичной, которое к тому же выходит за границы LongInt. И еще я не нашел пока что информации как пользоваться функцией BinStr.

Чтобы функция StrToInt понимала, что ей скармливают двоичное представление, у строки должен быть префикс %. Функция binStr имеет два аргумента, первый - число, которое надо преобразовать, второй - длина результата в символах. Поэтому рабочий код будет выглядеть примерно так:
Код: Выделить всё
var
  s1, s2, s3  :string;
  a, b, c :longint;
  n :byte;
...
     s1 := '1010010101';
     s2 := '0100101011';
     n := Length(s1);
     a := StrToInt('%'+s1);
     b := StrToInt('%'+s2);
     c := a xor b;
     s3 := binStr(c,n);

Re: Частный случай с оператором XOR. Нужна помощь.

СообщениеДобавлено: 03.01.2016 21:37:06
daesher
ANTIKLAN писал(а):Почему Result*2?

А как же? Мы уже прошлись по всем предыдущим цифрам, теперь сдвигаемся на разряд дальше. То есть, умножаем на основание системы счисления - т.е.2.
Если бы мы, например, анализировали строку с десятичным числом 123, то можно было бы взять первую цифру, понять, что она - 1, поместить в результат (или добавить к 0), умножить на 10, добавить вторую цифру, которая 2. Итого - 12, берём третью цифру - 3, умножаем на 10 предыдущий результат (итого 120), прибавляем 3. Итого 123.
Здесь вместо умножения на 10 идёт умножение на 2.

ANTIKLAN писал(а): И второе я могу использовать эти функции в программе "как есть"?

Естественно.
Снег Север писал(а):Чтобы функция StrToInt понимала, что ей скармливают двоичное представление, у строки должен быть префикс %.

Точно, я помнил, что что-то такое (аналог $ для hex) должно быть. Тогда можно делать ещё проще, но binstr всё ещё имеет недостаток с длиной строки.

Re: Частный случай с оператором XOR. Нужна помощь.

СообщениеДобавлено: 03.01.2016 22:58:22
ANTIKLAN
Все, ребятки! Спасибо! Все заработало как надо при использовании префикса "%"! Теперь двоичные представления обрабатываются как надо! :D