This repository has been archived on 2026-07-28. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
cmc/3sem/exam/bitmas.c
T
2025-04-13 21:48:15 +03:00

55 lines
1.5 KiB
C
Executable File

#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
int
return_bit_int(int *mas, int n)
{
unsigned int byte = mas[n / (sizeof(int) * 8)]; // (sizeof(int) * 8) == 32
int offset = 32 - 1 - n % 32;
return (byte & (1 << offset)) >> offset;
}
int
return_bit_byte(unsigned char *mas, int n)
{
unsigned int byte = mas[n / (sizeof(char) * 8)]; // (sizeof(char) * 8) == 8
int offset = 8 - 1 - n % 8;
return (byte & (1 << offset)) >> offset;
}
// пусть битовый массив записан в файл. Массив - свободные блоки ФС. Вывести максимальную длину свободных блоков.
int
main(int argc, char **argv)
{
int fd = open(argv[1], O_RDONLY);
int size = lseek(fd, 0, SEEK_END);
unsigned char *mas = malloc(size);
lseek(fd, 0, 0); // SEEK_CUR == 0, SEEK_SET == 1, SEEK_END == 2
for (int i = 0; i < size; ++i) {
read(fd, mas + i, 1); // читаем из файла массив
}
int max_len = 0;
int tmp = 0; // для хранения текущей длины
for (int i = 0; i < size * 8; ++i) { // пробегаем по всем битам
if (return_bit_byte(mas, i) == 1) {
tmp++;
} else {
max_len = (max_len > tmp) ? max_len : tmp;
tmp = 0;
}
}
max_len = (max_len > tmp) ? max_len : tmp; // если последний бит был 1, то надо доп проверку
printf("%d\n", max_len);
return 0;
}