Составить функцию inv (x, q, m), что возвращает значение x с инвертированными m битами, начиная с позиции q - C (СИ)
Формулировка задачи:
Составить функцию inv ( x , q , m ) , что возвращает значение x с инвертированными m битами, начиная с позиции q (другие биты не изменяются ) .
Решение задачи: «Составить функцию inv (x, q, m), что возвращает значение x с инвертированными m битами, начиная с позиции q»
textual
Листинг программы
#include <io.h>
#include <stdlib.h>
#include <stdio.h>
void inv(int* x, int q, int m)
{
*x ^= (1 << q) - 1;
*x ^= (1 << (q + m)) - 1;
}
void print_bin(int num)
{
if (num > 1)
print_bin(num >> 1);
printf("%d", num & 1);
}
int main(void)
{
FILE* fp;
int a, q, m;
if ((fp = fopen("d://test.dat", "r")) == NULL) {
printf("Error: couldn't open file.\n");
exit(1);
}
fscanf(fp, "%d %d %d", &a, &q, &m);
fprintf(stdout, "Data in file: %d %d %d\n", a, q, m);
fclose(fp);
printf("Before:\n", a, q, m);
print_bin(a);
inv(&a, q, m);
printf("\nAfter:\n");
print_bin(a);
return 0;
}
Объяснение кода листинга программы
- include
- Подключает библиотеку для работы с файлами - include
- Подключает библиотеку для работы с памятью - include
- Подключает библиотеку для работы с выводом - *void inv(int x, int q, int m)** - функция, которая инвертирует m битов числа x, начиная с позиции q
- void print_bin(int num) - функция, которая выводит двоичное представление числа
- int main(void) - точка входа в программу
- *FILE fp;** - переменная типа указатель на файл
- int a, q, m; - переменные для хранения данных из файла
- if ((fp = fopen(
d://test.dat,r)) == NULL) - открывает файл для чтения - printf(
Error: couldn't open file.\n); - выводит сообщение об ошибке - exit(1); - завершает программу с кодом ошибки
- fscanf(fp,
%d %d %d, &a, &q, &m); - считывает данные из файла в переменные a, q, m - fprintf(stdout,
Data in file: %d %d %d\n, a, q, m); - выводит данные из файла на экран - fclose(fp); - закрывает файл
- printf(
Before:\n); - выводит заголовокBefore: - print_bin(a); - выводит двоичное представление числа a
- inv(&a, q, m); - инвертирует m битов числа a, начиная с позиции q
- printf(
\nAfter:\n); - выводит заголовокAfter: - print_bin(a); - выводит двоичное представление числа a
- return 0; - завершает программу без ошибок