Форум программистов, компьютерный форум, киберфорум
Наши страницы
Pascal ABC
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/4: Рейтинг темы: голосов - 4, средняя оценка - 5.00
vioup
0 / 0 / 0
Регистрация: 07.04.2015
Сообщений: 40
1

XOR

06.09.2017, 15:43. Просмотров 737. Ответов 12
Метки нет (Все метки)

Есть вот такая простенькая программа.
Pascal
1
2
3
4
5
6
7
8
var
  i,j : integer;
begin
  readln(i);
  readln(j);
  i:= i xor j;
  writeln('xor - ', i);
end.
Если ввести числа 1111 и 1, то выведет 1110. А если ввести 1111 и 1000, то выводит 1983, а мне нужно, чтобы выводило 111.
Как это сделать?
Не пишите, пожалуйста, что числа нужно представить в шестнадцатеричной системе, я это знаю. Чего я не знаю, как это реализовать в коде.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.09.2017, 15:43
Ответы с готовыми решениями:

Напишите процедуру Xor
Напишите процедуру procedure _Xor (x, y: boolean), реализующую функцию...

xor в Паскаль
Привет. Объясните плз алгоритм этой операции (xor). Пример: x := 10 xor 1...

Функция XOR
Как выполнить функцию XOR для массива?

Xor шифрование
Доброго времени суток! Нужно написать программу xor шифрования строки другой...

Используя операции not, and, or, xor
Используя операции not, and, or, xor записать сложные условия , истиные для...

12
кот Бегемот
Платежеспособный зверь
8477 / 3919 / 1527
Регистрация: 28.10.2009
Сообщений: 10,166
06.09.2017, 21:48 2
Чего конкретно Вы хотите? Чтобы Ваша программа выдала ответ 111? Ну, так возьмите 110 и 1.
Вы неконкретно поставили вопрос.
0
vioup
0 / 0 / 0
Регистрация: 07.04.2015
Сообщений: 40
06.09.2017, 22:04  [ТС] 3
Я вполне корректно написал, что нужно ввести 1111 и 1000 и на выходе было 111.
0
кот Бегемот
Платежеспособный зверь
8477 / 3919 / 1527
Регистрация: 28.10.2009
Сообщений: 10,166
07.09.2017, 10:14 4
Цитата Сообщение от vioup Посмотреть сообщение
Я вполне корректно написал, что нужно ввести 1111 и 1000 и на выходе было 111.
Да, это понятно.
А XOR-то здесь причём? Программа переведёт числа в двоичную систему и проведёт побитовые операции. Другими словами, вместо Ваших чисел программа работает с числами 100001010111 и 1111101000
имеем:
10001010111
.1111101000
------------------
11110111111=1983

Если Вы введёте 15 и 8, то это и будет
1111
1000 и тут действительно получится 111, но двоичное, на экране появится 7
-----
.111=7

Ещё раз прошу уточнить, чего Вы хотите и с помощью какой операции.
0
vioup
0 / 0 / 0
Регистрация: 07.04.2015
Сообщений: 40
07.09.2017, 11:03  [ТС] 5
Цитата Сообщение от кот Бегемот Посмотреть сообщение
А XOR-то здесь причём?
Ну как-же причем?
1 xor 1 = 0
1 xor 0 = 1
1 xor 0 = 1
1 xor 0 = 1
Получилось 111? Получилось.
Только нужно, чтобы получалось не с одним на одно число, а с группой чисел. Такой, как 1111 и 1000 или похожими.
Ну в принципе, я себе на вопрос сам и ответил. Нужно будет поместить каждое число отдельно в массив.

Цитата Сообщение от кот Бегемот Посмотреть сообщение
Программа переведёт числа в двоичную систему и проведёт побитовые операции.
Я и хотел, чтобы программа не переводила в двоичную систему, а воспринимала их изначально, будто они уже в двоичной.

Цитата Сообщение от vioup Посмотреть сообщение
Чего я не знаю, как это реализовать в коде.
0
кот Бегемот
Платежеспособный зверь
8477 / 3919 / 1527
Регистрация: 28.10.2009
Сообщений: 10,166
07.09.2017, 11:20 6
Если я правильно понял, Вы хотите вводить двоичные числа и получать ответ в двоичной системе?
Ну, так ничего проще: добавьте две подпрограммы, их тут 100 раз делали и ваш алгоритм будет выглядеть так:
1. ВВод двух двоичных чисел
2. перевод их в десятичную систему.
3. Выполнение операции XOR
4. Перевод результата в двоичную систему
5. Вывод двоичного результата.
Пункты 2 и 4 выполняются с помощью процедур, неоднократно разобранных на форуме, остальное в вашей программе.
0
kolay_ne
16 / 18 / 11
Регистрация: 07.03.2016
Сообщений: 362
08.09.2017, 10:46 7
Берете и для каждого знака выполняете операцию:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
var a, b: string;
dig_a, dig_b: array of integer;
 
procedure Push_front<T>(var a: array of T; x: T);
begin
  SetLength(a, length(a) + 1);
  for i: integer := length(a) - 1 downto 1 do
  begin
    a[i] := a[i - 1]
  end;
  a[0] := x;
end;
 
begin
  readln(a);
  readln(b);
  foreach i: char in a do
  begin
    Push_front(dig_a, StrToInt(a[length(a)]));
    SetLength(a, length(a) - 1);
  end;
  foreach i: char in b do
  begin
    Push_front(dig_b, StrToInt(b[length(b)]));
    SetLength(b, length(b) - 1);
  end;
  while(length(dig_a) > length(dig_b)) do
    Push_front(dig_b, 0);
  while(length(dig_b) > length(dig_a)) do
    Push_front(dig_a, 0);
  for i: integer := 0 to length(dig_a) - 1 do
    write(dig_a[i] xor dig_b[i]);
end.
Можно без двух последних while (27, 29), но так меньше думать
1
Puporev
Модератор
54979 / 42287 / 29200
Регистрация: 18.05.2008
Сообщений: 99,910
08.09.2017, 12:37 8
Как написал дядя кот Бегемот.
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
function bintodec(s:string):integer;
var n,i:integer;
begin
n:=0;
for i:=length(s) downto 1 do
if s[i]='1' then inc(n,round(power(2,length(s)-i)));
result:=n;
end;
function dectobin(n:integer):string;
var s:string;
begin
s:='';
while n>0 do
 begin
  s:=inttostr(n mod 2)+s;
  n:=n div 2;
 end;
result:=s;
end;
var s1,s2:string;
begin
s1:='1111';
s2:='1000';
write(dectobin(bintodec(s1) xor bintodec(s2)))
end.
1
bormant
Модератор
Эксперт Pascal/DelphiЭксперт NIX
4004 / 2631 / 2123
Регистрация: 22.11.2013
Сообщений: 7,381
08.09.2017, 20:26 9
Попроще:
Pascal
1
2
3
4
5
6
7
8
9
10
11
var
  s, t: String;
  i: Integer;
begin
  Write('1: '); ReadLn(s);
  Write('2: '); ReadLn(t);
  for i:=1 to Length(s)-Length(t) do t:='0'+t;
  for i:=1 to Length(t)-Length(s) do s:='0'+s;
  for i:=1 to Length(s) do s[i]:=Chr(Ord('0')+Ord(s[i]<>t[i]));
  WriteLn('R: ',s);
end.
Добавлено через 3 минуты
Проверьте, пожалуйста, для ABC нужно что-то менять, или и так сгодится.
0
кот Бегемот
Платежеспособный зверь
8477 / 3919 / 1527
Регистрация: 28.10.2009
Сообщений: 10,166
08.09.2017, 20:28 10
Цитата Сообщение от bormant Посмотреть сообщение
Попроще:
Вот же счастливый человек...
он реально думает, что это попроще...
0
bormant
Модератор
Эксперт Pascal/DelphiЭксперт NIX
4004 / 2631 / 2123
Регистрация: 22.11.2013
Сообщений: 7,381
08.09.2017, 20:38 11
кот Бегемот,
ваш хрустальный шар кто-то повредил -- сеанс чтения мыслей потерпел фиаско...

Рантайм посложнее, код попроще.

Добавлено через 1 минуту
Хотя и рантайм попроще, там выше IntToStr пачка...

Добавлено через 5 минут
А вот тут и рантайм попроще должен быть:
Pascal
1
2
3
4
5
6
7
8
9
10
11
procedure XorIt(s, t: Longint);
begin
  if s div 10+t div 10<>0 then XorIt(s div 10, t div 10);
  Write((s and 1) xor (t and 1));
end;
var s, t: Longint;
begin
  Write('1: '); ReadLn(s);
  Write('2: '); ReadLn(t);
  Write('R: '); XorIt(s,t); WriteLn;
end.
0
кот Бегемот
Платежеспособный зверь
8477 / 3919 / 1527
Регистрация: 28.10.2009
Сообщений: 10,166
08.09.2017, 20:44 12
Цитата Сообщение от bormant Посмотреть сообщение
Рантайм посложнее, код попроще.
ну, так вы уже не пугайте людей командами типа
Pascal
1
2
for i:=1 to Length(t)-Length(s) do s:='0'+s;
for i:=1 to Length(s) do s[i]:=Chr(Ord('0')+Ord(s[i]<>t[i]));
Так и до сумасшедствия дойти несложно...
0
bormant
Модератор
Эксперт Pascal/DelphiЭксперт NIX
4004 / 2631 / 2123
Регистрация: 22.11.2013
Сообщений: 7,381
08.09.2017, 20:48 13
Цитата Сообщение от кот Бегемот Посмотреть сообщение
не пугайте людей командами типа
Я б написал
Pascal
1
2
3
const ZO: array [Boolean] of Char = ('0','1');
...
  for i:=1 to Length(s) do s[i]:=ZO[s[i]<>t[i]];
но это в ABC не поддерживается, Boolean здесь не считается порядковым типом и не пригоден для адресации массива.
0
08.09.2017, 20:48
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.09.2017, 20:48

Найти числа, XOR которых равен N
Найти числа, XOR которых равен N

Как работает функция XOR и что она делает?
Как работает функция XOR и что она делает?

Исключающее ИЛИ (XOR). Нужен пример операции побайтного XOR
Может кто-нибудь привести пример операции побайтного XOR?что-то вроде: есть...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru