Вт окт 02, 2012 22:55:58
Вт окт 02, 2012 23:03:24
Вт окт 02, 2012 23:08:00
Вт окт 02, 2012 23:13:26
struct Flag_Collection
{
unsigned flag1 : 1; // 0
unsigned flag2 : 1; // 1
unsigned flag3 : 1; // 2
//..... и так далее ...
unsigned flag8 : 1; // 7
};
// ....
strust Flag_Collection flagi;
// ...
flagi.flag1=0;
flagi.flag7=1;
Вт окт 02, 2012 23:25:05
#define x (data_bit & 0x01)
unsigned char data_bit;
if(key)
{
if (x==1) x=0;
else x=1;
}
Вт окт 02, 2012 23:29:29
Tolmi писал(а):
- Код:
struct Flag_Collection
{
unsigned flag1 : 1; // 0
unsigned flag2 : 1; // 1
unsigned flag3 : 1; // 2
//..... и так далее ...
unsigned flag8 : 1; // 7
};
// ....
strust Flag_Collection flagi;
// ...
flagi.flag1=0;
flagi.flag7=1;
Вт окт 02, 2012 23:35:54
Ваш код тоже не подходит
Для начала, если это не «так, для примера», а реальные переменные, очень рекомендую перестать использовать однобуквенные имена для чего-либо, кроме «очень локальных» переменных, например, индексов циклов. Т.е. от места определения такой переменной до места её исчезновения должно быть не больше половины экрана кодаArtos писал(а):Имею байтовые переменные
unsigned char x, y, z, k, l;
unsigned char b; /* это счётчик битов */
r = 1; /* переходим в приёма */
unsigned char bit_cnt;
receive_mode = 1;
enum { flag1 = 0x01, flag2 = 0x02, flag3 = 0x03 }; // Имена для примера :)))
uint8_t flags;
if (flags & flag1) flags &= ~flag2;
if (flag1) flag2 = 0;
struct {
unsigned char flag1 : 1; // выделяем под поле один бит
unsigned char flag2 : 1; // выделяем под поле один бит
unsigned char flag3 : 1; // выделяем под поле один бит
unsigned char : 1; // пропускаем один бит (ровняем state на полубайт), имя не обязательно
unsigned char state : 4; // выделяем под поле четыре бита
} fags; // в сумме 8 бит займут один байт
if (flags.flag1) flags.state = 3;
#ifdef SMALL_RAM
#define ONEBIT : 1 // будут выделены биты
#else
#define ONEBIT // будут выделены байты
#endif
struct {
unsigned char flag1 ONEBIT ;
unsigned char flag2 ONEBIT ;
unsigned char flag3 ONEBIT ;
} fags;
Вт окт 02, 2012 23:38:24
У битовых полей с volatile всё в порядке, но нужно помнить, что запись даже однобитового поля для чуть менее, чем всех процессоров будет неатомарной операцией и её надо заворачивать в запрет/разрешение прерываний.Artos писал(а):volatile bit x;
Вт окт 02, 2012 23:42:34
avreal писал(а):Для начала, если это не «так, для примера»,
struct Flag_Collection
{
unsigned flags_pass : 1; // 0
unsigned flag2 : 1; // 1
unsigned flag3 : 1; // 2
//..... и так далее ...
unsigned flag8 : 1; // 7
} flags;
if (flags_pass ) flags_pass = 0;
else flags_pass =1;
Вт окт 02, 2012 23:46:50
avreal писал(а):Запись в виде битовых полей
Код:
struct {
unsigned char flag1 : 1; // выделяем под поле один бит
unsigned char flag2 : 1; // выделяем под поле один бит
unsigned char flag3 : 1; // выделяем под поле один бит
unsigned char : 1; // пропускаем один бит (ровняем state на полубайт), имя не обязательно
unsigned char state : 4; // выделяем под поле четыре бита
} fags; // в сумме 8 бит займут один байт
if (flags.flag1) flags.state = 3;
приятнее, но может привести к размеру кода большему, чем с масками выше. Зависит от компилятора.
Но чем ближе светлое будущее, тем компиляторы умнее, так что постепенно это становится не таким страшным.
Вт окт 02, 2012 23:49:42
Вт окт 02, 2012 23:52:48
Artos писал(а):Ваш код тоже не подходит
#include <stdio.h>
#include <stdlib.h>
union Flag_Union {
unsigned char chr;
struct bite {
unsigned flag0:1;
unsigned flag1:1;
unsigned flag2:1;
unsigned flag3:1;
unsigned flag4:1;
unsigned flag5:1;
unsigned flag6:1;
unsigned flag7:1;
} flag;
};
union Flag_Union flagi;
int main(void) {
flagi.chr=0; // Clear all flags
flagi.flag.flag0=1;
flagi.flag.flag5=1;
if (flagi.flag.flag5==1 && flagi.flag.flag6==0){
printf("byte=%d, flags=%d,%d,%d,%d,%d,%d,%d,%d",
flagi.chr,
flagi.flag.flag0,flagi.flag.flag1,flagi.flag.flag2,flagi.flag.flag3,
flagi.flag.flag4,flagi.flag.flag5,flagi.flag.flag6,flagi.flag.flag7);
}
return 0;
}
byte=33, flags=1,0,0,0,0,1,0,0
Вт окт 02, 2012 23:56:20
Tolmi писал(а):flagi.flag.flagX можно через #define переопределить в x,y,z чтобы не тарабанить по клавиатуре каждый раз.
Ср окт 03, 2012 00:20:46
Artos писал(а):А как обьявить битовое поле с числом битов 32шт. и более?
наверное unsigned long chr {} ?
Ср окт 03, 2012 07:20:36
Ср окт 03, 2012 08:04:04
#define SetBit(reg, bit) reg |= (1<<bit)
#define ClearBit(reg, bit) reg &= (~(1<<bit))
#define InvBit(reg, bit) reg ^= (1<<bit)
#define BitIsSet(reg, bit) ((reg & (1<<bit)) != 0)
#define BitIsClear(reg, bit) ((reg & (1<<bit)) == 0)
…
SetBit(PORTB, 0); //установить нулевой бит порта B
InvBit(tmp,6); //инвертировать шестой бит переменной tmp
…
if (BitIsClear(PIND, 0)) { //если очищен нулевой бит в регистре PIND
….. //выполнить блок
}
Ср окт 03, 2012 10:03:36
Ср окт 03, 2012 12:25:15
metan писал(а):Здравствуйте!
Я думаю вполне можно попробовать заюзать такое:
Ср окт 03, 2012 17:57:40