MIPI_BaseC_WebinarFRTK/26_Seminar13/27_Microcontrollers/2_1_bits.c

58 lines
1.9 KiB
C
Raw Normal View History

2024-11-14 08:39:22 +03:00
//~ 1. Написать пару функций, одна из которых будет устанавливать все биты, а другая — снимать по маске.
//~ Возможное решение: bits.c
//~ Простейшая вещь, но довольно полезная (особенно в контексте того, что именно так работает большинство флешек).
#include <stdio.h>
#include <stdint.h>
//Начало решения
void set_all_bits (void *arg)
{
//Писать 0xFFFFFFFFFFFFFFFF тоже не очень,
//так как мы вообще говоря не знаем длину типа.
//~0 гарантирует единичные биты.
* (unsigned int*)arg = ~0;
}
int reset_some_bits(void *dest, unsigned int val)
{
*(unsigned int*)dest &= val;//приведение типов
return (*(unsigned int*)dest == val);
}
int set_some_bits(void *dest, unsigned int val)
{
*(unsigned int*)dest |= val;//приведение типов
return (*(unsigned int*)dest == val);
}
// Конец решения
int main()
{
2024-12-27 11:22:47 +03:00
float var = -0.1;
uint32_t a=4096;
uint32_t b=0x7fffffff;
uint32_t c=1<<(32-9);
2024-12-27 11:27:51 +03:00
uint32_t d=1<<(32-10);
2024-11-14 08:39:22 +03:00
int status = 0;
//~ scanf("%x%x%x%x", &a, &b, &c, &d); //a=4095, b=2000, c=4095, d=0xffff
set_all_bits(&a);
printf("set_all_bits a: %#X\n",a);
status = reset_some_bits(&a, 0x25);
status = printf("reset_some_bits 0x25 %d %#X\n",status, a);
set_all_bits(&a);
printf("set_all_bits a: %#X\n",a);
2024-12-27 11:22:47 +03:00
printf("vol = %f\n",var);
2024-11-14 08:39:22 +03:00
status = reset_some_bits(&var, b);
2024-12-27 11:22:47 +03:00
printf("reset_some_bits %d %#X %f\n",status, b, var);
status = reset_some_bits( &var, ~c );
printf("reset_some_bits %d %#X %f\n",status, c, var);
2024-12-27 11:27:51 +03:00
status = reset_some_bits(&var, ~d);
printf("reset_some_bits %d %#X %f\n",status, d, var);
2024-11-14 08:39:22 +03:00
return 0;
}