/ Forside / Teknologi / Udvikling / C/C++ / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
C/C++
#NavnPoint
BertelBra.. 2425
pmbruun 695
Master_of.. 501
jdjespers.. 500
kyllekylle 500
Bech_bb 500
scootergr.. 300
gibson 300
molokyle 287
10  strarup 270
Bits ...
Fra : Peter Brixen


Dato : 01-07-03 12:25

(Rimelig nybegynder i C). Jeg har lidt svært ved at forstå nogle ting
vedrørende bits. Fx. har jeg stødt på dette eksempel:

#define DB_MARKED ((unsigned)1 << ((sizeof(unsigned) * 8) - 1))
#define DB_INDEX_MASK (~DB_MARKED)

De bruges til en unsigned værdi, fx. som her:

dp->db_index[db_idx + 1] |= DB_MARKED;

Hvorfor bruges netop disse værdier og ikke bare 0x01, 0x02 eller 1, 2
osv.?

Generelt er jeg forvirret, og mangler noget overblik, så noget indsigt
og visdom ville være dejligt...




 
 
Robert Larsen (01-07-2003)
Kommentar
Fra : Robert Larsen


Dato : 01-07-03 15:09

Peter Brixen wrote:
> (Rimelig nybegynder i C). Jeg har lidt svært ved at forstå nogle ting
> vedrørende bits. Fx. har jeg stødt på dette eksempel:
>
> #define DB_MARKED ((unsigned)1 << ((sizeof(unsigned) * 8) - 1))
> #define DB_INDEX_MASK (~DB_MARKED)
>
> De bruges til en unsigned værdi, fx. som her:
>
> dp->db_index[db_idx + 1] |= DB_MARKED;
>
> Hvorfor bruges netop disse værdier og ikke bare 0x01, 0x02 eller 1, 2
> osv.?
>
> Generelt er jeg forvirret, og mangler noget overblik, så noget indsigt
> og visdom ville være dejligt...
>
>
>
Det kan være for at gøre koden mere letlæselig:

#define ENABLE_SOME_FEATURE (1 << 0)
#define ENABLE_SOME_OTHER_FEATURE (1 << 1)
#define ENABLE_DEBUGGING (1 << 2)

bitmask |= ENABLE_DEBUGGING;

i forhold til:

bitmask |= 4;

Hvad betyder 4 ???
I den første version er det ret let at læse at man slår debugging til.
Senere i koden står der så sikkert:

if(bitmask & ENABLE_DEBUGGING)
   printf("Very useful debugging message.\n");

Det kan også være for ikke at hardcode for meget. Hvis man alle steder i
sin kode bruger et tal, skal man ændre alle forekomster hvis værdien
skulle gå hen og ændre sig. Med en define ændrer man bare på
definitionen og recompiler. Skide smart.

Robert


Bertel Brander (01-07-2003)
Kommentar
Fra : Bertel Brander


Dato : 01-07-03 22:39

Peter Brixen wrote:
> (Rimelig nybegynder i C). Jeg har lidt svært ved at forstå nogle ting
> vedrørende bits. Fx. har jeg stødt på dette eksempel:
>
> #define DB_MARKED ((unsigned)1 << ((sizeof(unsigned) * 8) - 1))
> #define DB_INDEX_MASK (~DB_MARKED)
>
> De bruges til en unsigned værdi, fx. som her:
>
> dp->db_index[db_idx + 1] |= DB_MARKED;
>
> Hvorfor bruges netop disse værdier og ikke bare 0x01, 0x02 eller 1, 2
> osv.?
>
> Generelt er jeg forvirret, og mangler noget overblik, så noget indsigt
> og visdom ville være dejligt...
>

DB_MARKED sætter det øverste bit (MSB) i en unsigned (int), forudsat at
en char har 8 bit.

DB_INDEX_MASK kan bruges til at resete (cleare) det øverste bit, eller
vælge de øvrige bits.

Det er svært at gætte hvorfor man vælger MSB, ud fra den kode du har
vist, men det er muligt at man bruger de øvrige bits til "et eller
andet", f.ex et index.

/b

--
Bertel Brander, author of Wain, a free text editor for programmers:
http://home20.inet.tele.dk/midgaard/program.htm


Leo Havmøller (02-07-2003)
Kommentar
Fra : Leo Havmøller


Dato : 02-07-03 06:33

"Peter Brixen" <brixen@jyde.dk> wrote in message
news:3F016F7D.BE7697E1@jyde.dk...
> (Rimelig nybegynder i C). Jeg har lidt svært ved at forstå nogle ting
> vedrørende bits. Fx. har jeg stødt på dette eksempel:
>
> #define DB_MARKED ((unsigned)1 << ((sizeof(unsigned) * 8) - 1))

Det er for at koden er portabel. Når man kun skriver unsigned er det
implicit en int, hvis størrelse som bekendt er platformsafhængig (8-bit,
16-bit, 32-bit, 64-bit etc). Så den viste kode vil sætte den øverste bit en
en (unsigned) int, uanset platform.

Leo Havmøller.



Bertel Brander (02-07-2003)
Kommentar
Fra : Bertel Brander


Dato : 02-07-03 16:47

Leo Havmøller wrote:
> "Peter Brixen" <brixen@jyde.dk> wrote in message
> news:3F016F7D.BE7697E1@jyde.dk...
>
>>(Rimelig nybegynder i C). Jeg har lidt svært ved at forstå nogle ting
>>vedrørende bits. Fx. har jeg stødt på dette eksempel:
>>
>> #define DB_MARKED ((unsigned)1 << ((sizeof(unsigned) * 8) - 1))
>
>
> Det er for at koden er portabel. Når man kun skriver unsigned er det
> implicit en int, hvis størrelse som bekendt er platformsafhængig (8-bit,
> 16-bit, 32-bit, 64-bit etc). Så den viste kode vil sætte den øverste bit en
> en (unsigned) int, uanset platform.

En int er mindst 16 bit.
Den sætter kun det øverste bit hvis en char er 8 bit.

/b


Bertel Lund Hansen (02-07-2003)
Kommentar
Fra : Bertel Lund Hansen


Dato : 02-07-03 17:24

Bertel Brander skrev:

>>> #define DB_MARKED ((unsigned)1 << ((sizeof(unsigned) * 8) - 1))

>En int er mindst 16 bit.
>Den sætter kun det øverste bit hvis en char er 8 bit.

Nej. Den tager hensyn til sizeof(unsigned).

Hvis en unsigned fylder 4 byte, sætter den bit nummer 31.

--
Bertel
http://bertel.lundhansen.dk/   FIDUSO: http://fiduso.dk/

Bertel Brander (02-07-2003)
Kommentar
Fra : Bertel Brander


Dato : 02-07-03 19:07

Bertel Lund Hansen wrote:
> Bertel Brander skrev:
>
>
>>>> #define DB_MARKED ((unsigned)1 << ((sizeof(unsigned) * 8) - 1))
>
>
>>En int er mindst 16 bit.
>>Den sætter kun det øverste bit hvis en char er 8 bit.
>
>
> Nej. Den tager hensyn til sizeof(unsigned).
>
> Hvis en unsigned fylder 4 byte, sætter den bit nummer 31.

Hvis en char har 11 bits og en unsigned fylder 4 byte sætter den bit 31,
men MSB er bit 43.

Det ville være mere korrekt at bruge CHAR_BIT (fra limits.h), og ikke
8 i udtrykket.

/b


Søg
Reklame
Statistik
Spørgsmål : 177580
Tips : 31968
Nyheder : 719565
Indlæg : 6409081
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste