Битовые операции над числами

Задача

Выполнить логические побитовые операции "И", "ИЛИ" и др. над числами 5 и 6. Выполнить над числом 5 побитовый сдвиг вправо и влево на два знака. Объяснить полученный результат.

Пояснение к задаче и алгоритм решения

Обычно в языках программирования предусмотрены так называемые логические побитовые операции. Они выполняются не над самими числами, а над их двоичным представлением. Например, число 5 в двоичной системе счисления выражается как 101, а число 6 - как 110. Выполняя логическую побитовую операцию "И" получим число 4, т.к. в младшим разряде числа 5 стоит 1, а числа 6 - 0. Выражение "1 и 0" возвращает 0. Продолжая поразрядно выполнять логическое "И" в среднем разряде получим 0, а в старшем 1. Можно записать так:
101
110
100
Двоичное число 100 - это десятичное число 4.

Выполним операцию побитового логического "ИЛИ":
101
110
111 - это число 7.

"Исключающее ИЛИ":
101
110
011 - это число 3.

При сдвиге биты просто сдвигаются на указанное количество ячеек в освободившиеся ячейки дописываются нули или единицы (это зависит от ряда причин):
110 << 2 = 11000 (число 24),
110 >> 2 = 001 (число 1).

Исходный код на языке программирования Pascal

var
     a, b: byte;
begin
     a := 5;
     b := 6;
     writeln('a=', a);
     writeln('b=', b);
     writeln('a and b = ', a and b);
     writeln('a or b = ', a or b);
     writeln('a xor b = ', a xor b);
     writeln('b shl 2 = ', b shl 2);
     writeln('b shr 2 = ', b shr 2);      
end.

Пример(ы) выполнения программы на языке Pascal

a=5
b=6
a and b = 4
a or b = 7
a xor b = 3
b shl 2 = 24
b shr 2 = 1

Особенности решения на языке программирования Pascal

В Паскале обычные логические операции и побитовые обозначаются одинаково. Первые применяются, если операнды имеют булевый тип (они получаются в результате простых логических операций >, < и др.), а вторые - если операнды представляют собой целые числа (неважно какого типа).

Исходный код на языке программирования C

#include <stdio.h>
 
main() {
    int a, b;
    a = 5;
    b = 6;
    printf("%d & %d = %d\n", a, b, a & b);
    printf("%d | %d = %d\n", a, b, a | b);
    printf("%d ^ %d = %d\n", a, b, a ^ b);
    printf("%d << 2 = %d\n", b, b << 2);
    printf("%d >> 2 = %d\n", b, b >> 2);
}

Пример(ы) выполнения программы на языке C

5 & 6 = 4
5 | 6 = 7
5 ^ 6 = 3
6 << 2 = 24
6 >> 2 = 1

Исходный код на языке программирования Python

a = 5
print("%d = %s" % (a, bin(a)))
b = 6
print("%d = %s" % (b, bin(b)))
 
print("%d & %d = %d (%s)" % (a,b,a&b,bin(a&b)))
print("%d | %d = %d (%s)" % (a,b,a|b,bin(a|b)))
print("%d ^ %d = %d (%s)" % (a,b,a^b,bin(a^b)))
print("%d << 2 = %d (%s)" % (b,b<<2,bin(b<<2)))
print("%d >> 2 = %d (%s)" % (b,b>>2,bin(b>>2)))

Пример(ы) выполнения программы на языке Python

5 = 0b101
6 = 0b110
5 & 6 = 4 (0b100)
5 | 6 = 7 (0b111)
5 ^ 6 = 3 (0b11)
6 << 2 = 24 (0b11000)
6 >> 2 = 1 (0b1)

Исходный код на языке программирования Basic

a = 5
b = 6
print "5 & 6 = " + (a&b)
print "5 | 6 = " + (a|b)

Пример(ы) выполнения программы на языке Basic

5 & 6 = 4
5 | 6 = 7

Особенности решения на языке программирования Basic

Из битовых операторов в Basic-256 нашлись только "И", "ИЛИ" и отрицание. Исключающего "ИЛИ", а также сдвигов нет.

Тема

Линейные алгоритмы

Уровень сложности

Средний

Дата публикации