Частный случай с оператором XOR. Нужна помощь.
Модератор: Модераторы
Частный случай с оператором XOR. Нужна помощь.
Всем привет!
Подскажите пожалуйста как сделать операцию вида 1010010101 xor 0100101011, если два этих числа записаны как строковые переменные? И второй вопрос поймет ли компилятор что это двоичные числа самостоятельно или нужно делать перевод в двоичную систему? Если да, то как? Если не трудно пример наглядный продемонстрируйте.
Подскажите пожалуйста как сделать операцию вида 1010010101 xor 0100101011, если два этих числа записаны как строковые переменные? И второй вопрос поймет ли компилятор что это двоичные числа самостоятельно или нужно делать перевод в двоичную систему? Если да, то как? Если не трудно пример наглядный продемонстрируйте.
- Снег Север
- долгожитель
- Сообщения: 3070
- Зарегистрирован: 27.11.2007 15:14:47
- Контактная информация:
Перевести ваши строки в LongInt функцией StrToInt. Выполнить операцию xor и перевести результат в строку функцией binStr. Так компилятор поймет... 
Снег Север писал(а):Перевести ваши строки в LongInt функцией StrToInt. Выполнить операцию xor и перевести результат в строку функцией binStr. Так компилятор поймет...
Так я пробовал это не будет числом в двоичной системе это будет огромное число в десятичной, которое к тому же выходит за границы LongInt. И еще я не нашел пока что информации как пользоваться функцией BinStr.
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.
Здесь есть недоделки, которые ты тебе следует исправить самостоятельно.
В приведённом тобой частном случае, всё работает успешно.
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 КБ) 626 скачиваний
скалогрыз писал(а):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? И второе я могу использовать эти функции в программе "как есть"?
- Снег Север
- долгожитель
- Сообщения: 3070
- Зарегистрирован: 27.11.2007 15:14:47
- Контактная информация:
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);
ANTIKLAN писал(а):Почему Result*2?
А как же? Мы уже прошлись по всем предыдущим цифрам, теперь сдвигаемся на разряд дальше. То есть, умножаем на основание системы счисления - т.е.2.
Если бы мы, например, анализировали строку с десятичным числом 123, то можно было бы взять первую цифру, понять, что она - 1, поместить в результат (или добавить к 0), умножить на 10, добавить вторую цифру, которая 2. Итого - 12, берём третью цифру - 3, умножаем на 10 предыдущий результат (итого 120), прибавляем 3. Итого 123.
Здесь вместо умножения на 10 идёт умножение на 2.
ANTIKLAN писал(а): И второе я могу использовать эти функции в программе "как есть"?
Естественно.
Снег Север писал(а):Чтобы функция StrToInt понимала, что ей скармливают двоичное представление, у строки должен быть префикс %.
Точно, я помнил, что что-то такое (аналог $ для hex) должно быть. Тогда можно делать ещё проще, но binstr всё ещё имеет недостаток с длиной строки.
Все, ребятки! Спасибо! Все заработало как надо при использовании префикса "%"! Теперь двоичные представления обрабатываются как надо! 
