Avatar billede ladyhawke Novice
03. november 2004 - 14:48 Der er 12 kommentarer og
2 løsninger

opret/tilgå 8 bit flag

Jeg har brug for at opbevare 8 boolske variable på en nem måde og jeg tænkte at et 8 bit flag var en god ide, men hvordan definerer man sådan et (win32 c++) og hvordan læser/sætter man værdierne.

Det er givet vist ikke så svært, men kom bare med et forslag
Avatar billede sovsekoder Nybegynder
03. november 2004 - 14:50 #1
gem en kontrol byte;

char ch;

definer dine bits
#define bit0 1
#define bit1 2
#define bit2 4
#define bit3 8

check for en bit:
if((ch & bit1) != 0) {
  // bitten er sat

}
else {
  // bitten er ikke sat

}
Avatar billede sovsekoder Nybegynder
03. november 2004 - 14:52 #2
og så er ideen jo nok at lave nogle gode navne:

#define BIT_STATUS 1
#define BIT_READY 2
#define BIT_CLEAR 4
#define BIT_UNKNOWN 8
..
..
..
#define BIT_SOVSEKODER 128

.. og så :
if( (ch & BIT_SOVSEKODER) != 0)
{
//bit er sat
}
else
{
//bit er ikke sat

}
Avatar billede ladyhawke Novice
03. november 2004 - 14:55 #3
hmmm, det forstår jeg ikke helt...
Du definerer 3 bit og så har du en char...

Hvis jeg vil sætte bit 7 til '1' hvordan gør jeg så?

Bit'ene  skal opbevare status på et antal checkbokse, så hvis jeg havde en variabel, der indeholdt 8 boolks værdier, men ved ikke om det så kræver et array af bool, men det burde vel kunne bruges hvis det skal være?
Avatar billede sovsekoder Nybegynder
03. november 2004 - 14:58 #4
sætte bit 7 på ch:
#define bit7 128

ch = ch | bit7;
Avatar billede sovsekoder Nybegynder
03. november 2004 - 15:01 #5
#define CHECKBOX1 1 // bit 0
#define CHECKBOX2 2 // bit 1
#define CHECKBOX3 4 // bit 2
#define CHECKBOX4 8 // bit 3
#define CHECKBOX5 16 // bit 4
#define CHECKBOX6 32 // bit 5
#define CHECKBOX7 64 // bit 6
#define CHECKBOX8 128 // bit 7

BYTE checkBoxFlag = 0;

// sætte bit 5 og bit 3
checkBoxFlag = checkBoxFlag | CHECKBOX4 | CHECKBOX6;

// tjekke om bit 6 er sat:
if( (checkBoxFlag & CHECKBOX7) != 0)
{
  printf("den er sat!!\n");
}

// Reset bit4:
checkboxFlag = checkboxFlag & (!CHECKBOX5);
Avatar billede ladyhawke Novice
03. november 2004 - 15:08 #6
hmmm, jeg prøver at se hvad der er nemmest, men tak for den sidste stump kode, det hjalp :o)
Avatar billede arne_v Ekspert
03. november 2004 - 15:08 #7
struct flags
{
  int b1 : 1;
  int b2 : 1;
  int b3 : 1;
  int b4 : 1;
  int b5 : 1;
  int b6 : 1;
  int b7 : 1;
  int b8 : 1;
};

struct flags f;
f.b1=1;
f.b2=0;
if(f.b1) {
Avatar billede ladyhawke Novice
03. november 2004 - 15:30 #8
har nu lavet en

bool checkStatus[8]

som jeg sætter/læser i de løkker som håndterer checboksene.

Jeg er glad for forslagene, så blev jeg også lidt klogere, så læg et svar :o)
Avatar billede sovsekoder Nybegynder
03. november 2004 - 15:32 #9
oki doki..
Avatar billede ladyhawke Novice
03. november 2004 - 16:23 #10
arne_v læg du bare svar også...
Avatar billede arne_v Ekspert
03. november 2004 - 16:37 #11
ok
Avatar billede arne_v Ekspert
03. november 2004 - 16:40 #12
Bare for en god ordens skyld så fylder en bool altså 1 byte = 8 bit.
Avatar billede arne_v Ekspert
03. november 2004 - 16:40 #13
Men apropos bytes og bits så skulle min struct nu også være:

struct flags
{
  unsigned char b1 : 1;
  unsigned char b2 : 1;
  unsigned char b3 : 1;
  unsigned char b4 : 1;
  unsigned char b5 : 1;
  unsigned char b6 : 1;
  unsigned char b7 : 1;
  unsigned char b8 : 1;
};

for kun at fylde 1 byte.
Avatar billede ladyhawke Novice
03. november 2004 - 19:34 #14
Tak for opklaring og information :o)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester