58 lines
1.9 KiB
C
58 lines
1.9 KiB
C
//~ 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()
|
||
{
|
||
float var = 0;
|
||
uint32_t a=4095;
|
||
uint32_t b=2000;
|
||
uint32_t c=4095;
|
||
uint32_t d=0xffff;
|
||
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);
|
||
|
||
status = reset_some_bits(&var, b);
|
||
printf("reset_some_bits %d %#X %f\n",status, a, var);
|
||
status = reset_some_bits( &var, c );
|
||
printf("reset_some_bits %d %#X %f\n",status, a, var);
|
||
set_all_bits(&var);
|
||
status = reset_some_bits(&var, d);
|
||
printf("reset_some_bits %d %#X %f\n",status, a, var);
|
||
|
||
return 0;
|
||
}
|