Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Материалы для подготовки к экзамену по ОП.docx
Скачиваний:
2
Добавлен:
01.07.2025
Размер:
298 Кб
Скачать
☆

Примеры

1.

Напишем функции, которые позволяют определять и изменять определённый бит числа

Для того, чтобы узнать, какой бит (1 или 0) стоит на позиции n, воспользуемся логическим умножением.

Пусть имеется число 9

00001001

Нужно узнать, выставлен ли бит на позиции 3 (начиная с нуля). Для этого умножим его на число, у которого все биты равны нулю, кроме третьего:

00001001 & 00001000 = 00001000

Теперь узнаем значение бита в позиции 6

00001001 & 01000000 = 00000000

Таким образом, если мы получаем ответ, равный нулю, то на искомой позиции находится ноль, иначе единица. Чтобы получить число, состоящее из нулей с одним битом на нужной позиции, сдвинем 1 на нужное число бит влево.

#include <stdio.h>

#include <conio.h>

#include <limits.h>

int checkbit(const int value, const int position) {

int result;

if ((value & (1 << position)) == 0) {

result = 0;

} else {

result = 1;

}

return result;

}

void main() {

int a = 3;

size_t len = sizeof(int) * CHAR_BIT;

size_t i;

for (i = 0; i < len; i++) {

printf("%d", checkbit(a, i));

}

_getch();

}

Заметьте, что в функции условие записано так

(value & (1 << position)) == 0

Потому что без скобок сначала будет вычислено равенство нулю и только потом выполнено умножение.

value & (1 << position) == 0

Функцию можно упростить

int checkbit(const int value, const int position) {

return ((value & (1 << position)) != 0);

}

2.

Функция, которая выставляет бит на n-й позиции в единицу.

Известно, что логическое сложение любого бита с 1 будет равно 1. Так что для установки n-го бита нужно логически сложить число с таким, у которого все биты, кроме нужного, равны нулю. Как получить такое число, уже рассмотрено.

int setbit(const int value, const int position) {

return (value | (1 << position));

}

3.

Функция, которая устанавливает бит на n-й позиции в ноль.

Для этого нужно, чтобы все биты числа, кроме n-го, не изменились. Умножим число на такое, у которого все биты равны единице, кроме бита под номером n. Например

0001011 & 1110111 = 0000011

Чтобы получить такую маску, сначала создадим число с нулями и одной единицей, а потом инвертируем его.

int unsetbit(const int value, const int position) {

return (value & ~(1 << position));

}

4.

Функция, изменющая значение n-го бита на противоположное.

Для этого воспользуемся функцией исключающего или: применим операцию XOR к числу, которое состоит из одних нулей и одной единицы на месте нужного бита.

int switchbit(const int value, const int position) {

return (value ^ (1 << position));

}

Проверка

#include <stdio.h>

#include <conio.h>

#include <limits.h>

int checkbit(const int value, const int position) {

return ((value & (1 << position)) != 0);

}

int setbit(const int value, const int position) {

return (value | (1 << position));

}

int unsetbit(const int value, const int position) {

return (value & ~(1 << position));

}

int switchbit(const int value, const int position) {

return (value ^ (1 << position));

}

void printbits(int n) {

//CHAR_BIT опеределён в библиотеке limits.h

//и хранит число бит в байте для данной платформы

size_t len = sizeof(int)* CHAR_BIT;

size_t i;

for (i = 0; i < len; i++) {

printf("%d", checkbit(n, i));

}

printf("\n");

}

void main() {

int a = 3;

size_t len = sizeof(int) * CHAR_BIT;

size_t i;

printbits(a);

a = setbit(a, 5);

printbits(a);

a = unsetbit(a, 5);

printbits(a);

a = switchbit(a, 11);

printbits(a);

a = switchbit(a, 11);

printbits(a);

}