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

Форум для изучающих FPC и их учителей.

Модератор: Модераторы

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

Сообщение ANTIKLAN » 02.01.2016 17:44:11

Всем привет!
Подскажите пожалуйста как сделать операцию вида 1010010101 xor 0100101011, если два этих числа записаны как строковые переменные? И второй вопрос поймет ли компилятор что это двоичные числа самостоятельно или нужно делать перевод в двоичную систему? Если да, то как? Если не трудно пример наглядный продемонстрируйте.
Аватара пользователя
ANTIKLAN
новенький
 
Сообщения: 55
Зарегистрирован: 25.02.2015 09:21:42

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

Сообщение Снег Север » 02.01.2016 17:54:32

Перевести ваши строки в LongInt функцией StrToInt. Выполнить операцию xor и перевести результат в строку функцией binStr. Так компилятор поймет... :D
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 3039
Зарегистрирован: 27.11.2007 16:14:47

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

Сообщение ANTIKLAN » 03.01.2016 01:26:52

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

Так я пробовал это не будет числом в двоичной системе это будет огромное число в десятичной, которое к тому же выходит за границы LongInt. И еще я не нашел пока что информации как пользоваться функцией BinStr.
Аватара пользователя
ANTIKLAN
новенький
 
Сообщения: 55
Зарегистрирован: 25.02.2015 09:21:42

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.

Здесь есть недоделки, которые ты тебе следует исправить самостоятельно.
В приведённом тобой частном случае, всё работает успешно.
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

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

Сообщение daesher » 03.01.2016 10:47:54

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;                     


Приложен простейший проект, демонстрирующий перевод
Вложения
binner.zip
(126.83 КБ) Скачиваний: 507
daesher
постоялец
 
Сообщения: 221
Зарегистрирован: 09.03.2010 22:17:14

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

Сообщение ANTIKLAN » 03.01.2016 14:18:12

скалогрыз писал(а):
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? И второе я могу использовать эти функции в программе "как есть"?
Аватара пользователя
ANTIKLAN
новенький
 
Сообщения: 55
Зарегистрирован: 25.02.2015 09:21:42

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);
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 3039
Зарегистрирован: 27.11.2007 16:14:47

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

Сообщение daesher » 03.01.2016 21:37:06

ANTIKLAN писал(а):Почему Result*2?

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

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

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

Точно, я помнил, что что-то такое (аналог $ для hex) должно быть. Тогда можно делать ещё проще, но binstr всё ещё имеет недостаток с длиной строки.
daesher
постоялец
 
Сообщения: 221
Зарегистрирован: 09.03.2010 22:17:14

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

Сообщение ANTIKLAN » 03.01.2016 22:58:22

Все, ребятки! Спасибо! Все заработало как надо при использовании префикса "%"! Теперь двоичные представления обрабатываются как надо! :D
Аватара пользователя
ANTIKLAN
новенький
 
Сообщения: 55
Зарегистрирован: 25.02.2015 09:21:42


Вернуться в Обучение Free Pascal

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3

Рейтинг@Mail.ru