В этой программе множество ошибок. 1. В заголовке процедуры procedure summ(plus:string;minus:string); параметры plus и minus описаны, как строки. В теле процедуры обоим параметрам присваивается значение, равное соединению строк a и b, а вовсе не сумма чисел и их разность, как требует условие. 2. Поскольку параметры не имеют описателя var, после выхода из процедуры их исходное значение не изменяется. 3. Операторы Readn(b) дважды выполняют присваивание переменной b, а переменная a значения не получает. 4. Вызов процедуры summ неверен, поскольку вместо пары строковых фактических параметров используется вызов процедуры Writen, что синтаксически неверно.
Это понимать так, как и написано: n XOR x, где x равно (n>>1) (число, которое получится, если побитово сдвинуть n вправо на 1). Побитовый сдвиг это такая операция, при которой двоичная запись числа сдвигается на указанное количество бит вправо или влево, а пустые биты заполняются значением бита знака числа n (+ это 0, минус это 1). Например переменная n размером 1 байт имеет значение 7, это выглядит как 00000111. Если выполнить операцию n>>1, то надо просто стереть (1) одну правую единицу, а слева дописать один ноль (ноль, потому что n положительное, если бы n было отрицательное, то дописывается 1). Получится 00000011=3, то есть 7>>1 = 3. Таким образом (если n=7), исходная запись означала бы n^(n>>1) = 7 XOR (7>>1) = 7 XOR 3 = 00000111 XOR 00000011 = 00000100 = 4 Вроде так как-то.
1. В заголовке процедуры procedure summ(plus:string;minus:string); параметры plus и minus описаны, как строки. В теле процедуры обоим параметрам присваивается значение, равное соединению строк a и b, а вовсе не сумма чисел и их разность, как требует условие.
2. Поскольку параметры не имеют описателя var, после выхода из процедуры их исходное значение не изменяется.
3. Операторы Readn(b) дважды выполняют присваивание переменной b, а переменная a значения не получает.
4. Вызов процедуры summ неверен, поскольку вместо пары строковых фактических параметров используется вызов процедуры Writen, что синтаксически неверно.
Побитовый сдвиг это такая операция, при которой двоичная запись числа сдвигается на указанное количество бит вправо или влево, а пустые биты заполняются значением бита знака числа n (+ это 0, минус это 1).
Например переменная n размером 1 байт имеет значение 7, это выглядит как 00000111. Если выполнить операцию n>>1, то надо просто стереть (1) одну правую единицу, а слева дописать один ноль (ноль, потому что n положительное, если бы n было отрицательное, то дописывается 1). Получится 00000011=3, то есть 7>>1 = 3.
Таким образом (если n=7), исходная запись означала бы n^(n>>1) = 7 XOR (7>>1) = 7 XOR 3 = 00000111 XOR 00000011 = 00000100 = 4
Вроде так как-то.