/ 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
bit ud masning af en Word
Fra : Nyberg


Dato : 30-01-02 20:47

Hej

Er der nogle der ved hvordan man kan maske bit ud i C ?
mit problem er af jeg har en WORD hvor jeg skal se hvilke bit der er sat til
et også lave en handling ud det.

jeg haved ting på en for (i=0;i>=16;i++) og så køre bitne igemmen.

MVH

René






 
 
Byrial Jensen (30-01-2002)
Kommentar
Fra : Byrial Jensen


Dato : 30-01-02 21:39

Nyberg <Nyberg@T-Online.de> skrev:
> Hej
>
> Er der nogle der ved hvordan man kan maske bit ud i C ?

#define ErBitSat (ord, bit_nummer) (ord & (1 << bit_nummer))
#define SætBit (ord, bit_nummer) (ord |= (1 << bit_nummer))
#define SletBit (ord, bit_nummer) (ord &= ~(1 << bit_nummer))

> mit problem er af jeg har en WORD hvor jeg skal se hvilke bit der er sat til
> et også lave en handling ud det.

Jeg ved ikke hvad en WORD er for noget, men ovenstående makroer
burde kunne give dig inspiration.

> jeg haved ting på en for (i=0;i>=16;i++) og så køre bitne igemmen.

Den løkke vil ikke køre noget igennem da betingelsen ikke er
opfyldt første (og dermed eneste) gang den prøves.

uint16_t Mit_16_bit_ord = En_eller_anden_initialisering ();
uint16_t bit;
int i;
for (bit = 1, i = 0 ; bit ; bit <<= 1, i ++)
{
if (Mit_16_bit_ord & bit)
Gør_noget_fordi_bitnummeret_i_argumentet_er_sat (i);
}

Nyberg (30-01-2002)
Kommentar
Fra : Nyberg


Dato : 30-01-02 22:00

Hej
tak jeg tro det var det jeg manglede

> Jeg ved ikke hvad en WORD er for noget, men ovenstående makroer
> burde kunne give dig inspiration.

WORD er en 4 byte værdig man andvender er det c script som jeg abejder med,
jeg skulle nok ha skrevet uint.

tak
René



Byrial Jensen (30-01-2002)
Kommentar
Fra : Byrial Jensen


Dato : 30-01-02 22:28

Byrial Jensen <bjensen@nospam.dk> skrev:
> #define ErBitSat (ord, bit_nummer) (ord & (1 << bit_nummer))
> #define SætBit (ord, bit_nummer) (ord |= (1 << bit_nummer))
> #define SletBit (ord, bit_nummer) (ord &= ~(1 << bit_nummer))

Man kan også gøre for meget ud af at stille linjerne pænt op. Der
må ikke være mellemrum mellem makronavn og den første parentes.
(Når der er det, opfattes det som en makro uden argumneter i steden
for en makro med to argumenter).

Simon Strandgaard (30-01-2002)
Kommentar
Fra : Simon Strandgaard


Dato : 30-01-02 22:01

enum {
bit_something =1<<0,
bit_somethingelse=1<<1,
bit_somethingdifferent=1<<2,
};

void Dispatcher(uint action)
{
if(action & bit_something) dosomething;
if(action & bit_somethingelse) dosomethingelse;
if(action & bit_somethingdifferent) dosomethingdifferent;
}

Nyberg <Nyberg@T-Online.de> skrev i en
nyhedsmeddelelse:a39i56$9lq$04$1@news.t-online.com...
> Er der nogle der ved hvordan man kan maske bit ud i C ?
> mit problem er af jeg har en WORD hvor jeg skal se hvilke bit der er sat
til
> et også lave en handling ud det.
>
> jeg haved ting på en for (i=0;i>=16;i++) og så køre bitne igemmen.




Jesper Louis Anderse~ (01-02-2002)
Kommentar
Fra : Jesper Louis Anderse~


Dato : 01-02-02 10:30

On Wed, 30 Jan 2002 22:01:16 +0100,
Simon Strandgaard <0bz63fz3m1qt3001@sneakemail.com> wrote:
> enum {
> bit_something =1<<0,
> bit_somethingelse=1<<1,
> bit_somethingdifferent=1<<2,
> };
>
> void Dispatcher(uint action)
> {
> if(action & bit_something) dosomething;
> if(action & bit_somethingelse) dosomethingelse;
> if(action & bit_somethingdifferent) dosomethingdifferent;
> }
>
Diverse MUD's har det med at være skrevet i C. De anvender følgende
analogi:

#define BIT1      1
#define BIT2      2
#define BIT3      4
....


if (action == BIT1 |
BIT2 |
BIT3) {

...

}
>
Sådan lidt småfrit fra hukommelsen... (og ja, det er kønnere i C++)

--
Jesper

Byrial Jensen (01-02-2002)
Kommentar
Fra : Byrial Jensen


Dato : 01-02-02 16:47

Jesper Louis Andersen <jlouis@jarnsaxa.diku.dk> skrev:
> Diverse MUD's har det med at være skrevet i C. De anvender følgende
> analogi:
>
> #define BIT1      1
> #define BIT2      2
> #define BIT3      4
> ...
>
>
> if (action == BIT1 |
> BIT2 |
> BIT3) {
>
> ...
>
> }

Den if-betingelse er altid opfyldt uanset værdien af action.
action sammenlignes først med BIT1 hvilket giver enten 0 eller 1.
Dette resultat bliver så bitvist or'et med først BIT2 og så BIT3.
Resultat bliver altid enten 6 eller 7.

> Sådan lidt småfrit fra hukommelsen...

Forhåbentlig.

> (og ja, det er kønnere i C++)

Hvordan det (hvis ellers C-koden havde været korrekt og så køn som
C-kode nu en gang kan blive)?

Jesper Louis Anderse~ (01-02-2002)
Kommentar
Fra : Jesper Louis Anderse~


Dato : 01-02-02 18:56

On Fri, 01 Feb 2002 15:46:46 GMT, Byrial Jensen <bjensen@nospam.dk> wrote:
> Jesper Louis Andersen <jlouis@jarnsaxa.diku.dk> skrev:
>> if (action == BIT1 |
>> BIT2 |
>> BIT3) {
>>
>> ...
>>
>> }
>
> Den if-betingelse er altid opfyldt uanset værdien af action.

Hæ... jeg kan aldrig huske operatorpræcedens... :)

--
Jesper

Morten Guldager (31-01-2002)
Kommentar
Fra : Morten Guldager


Dato : 31-01-02 22:39

In article <a39i56$9lq$04$1@news.t-online.com>, Nyberg wrote:
>
> Er der nogle der ved hvordan man kan maske bit ud i C ?
> mit problem er af jeg har en WORD hvor jeg skal se hvilke bit der er sat til
> et også lave en handling ud det.

Hvad med en union med en struct med bit felter?

union
{
struct
{
int dyt:1;
int baat:1;
} bits;
int tal;
} hans;



/Morten

Mogens Hansen (01-02-2002)
Kommentar
Fra : Mogens Hansen


Dato : 01-02-02 06:46


"Morten Guldager" <spamtrap@mogul.dk> wrote in message
news:slrna5jebb.fm8.spamtrap@guldager.uni.to...
> In article <a39i56$9lq$04$1@news.t-online.com>, Nyberg wrote:
> >
>
> Hvad med en union med en struct med bit felter?

Der er ingen garanti for at det virker.

Venlig hilsen

Mogens Hansen



Morten Guldager (01-02-2002)
Kommentar
Fra : Morten Guldager


Dato : 01-02-02 09:20

In article <a3d9pt$12s$1@news.cybercity.dk>, Mogens Hansen wrote:
>
> "Morten Guldager" <spamtrap@mogul.dk> wrote in message
> news:slrna5jebb.fm8.spamtrap@guldager.uni.to...
>> In article <a39i56$9lq$04$1@news.t-online.com>, Nyberg wrote:
>> >
>>
>> Hvad med en union med en struct med bit felter?
>
> Der er ingen garanti for at det virker.

Hvad skulle problemet være?



/Morten

Mogens Hansen (01-02-2002)
Kommentar
Fra : Mogens Hansen


Dato : 01-02-02 10:48


"Morten Guldager" <spamtrap@mogul.dk> wrote in message
news:slrna5kjtc.kb1.spamtrap@guldager.uni.to...
> In article <a3d9pt$12s$1@news.cybercity.dk>, Mogens Hansen wrote:
> >
> > "Morten Guldager" <spamtrap@mogul.dk> wrote in message
> > news:slrna5jebb.fm8.spamtrap@guldager.uni.to...
> >> In article <a39i56$9lq$04$1@news.t-online.com>, Nyberg wrote:
> >> >
> >>
> >> Hvad med en union med en struct med bit felter?
> >
> > Der er ingen garanti for at det virker.
>
> Hvad skulle problemet være?

At det er undefine behaviour i C og C++ og implementation-defined behaviour
i C99.
Det kan være at det virker, som du forventer. Det kan være at det ikke
virker som du forventer.

Det har været diskuteret en del gange på denne nyhedsgruppe.
Se f.eks.
http://groups.google.com/groups?hl=da&threadm=9grtmm%241q2v%241%40news.cyber
city.dk&rnum=1&prev=/groups%3Fq%3Dmogens_h%2540dk-online.dk%2Bunion%26hl%3Dd
a%26selm%3D9grtmm%25241q2v%25241%2540news.cybercity.dk%26rnum%3D1
og hvis du ikke syntes det er tilstrækkeligt så se Andrew Köenig's
forklaringer
http://groups.google.com/groups?hl=da&threadm=2Oi95.24363%24qS3.52619%40tor-
nn1.netcom.ca&rnum=1&prev=/groups%3Fq%3Dark%2540research.att.com%2Bunion%26h
l%3Dda%26selm%3D2Oi95.24363%2524qS3.52619%2540tor-nn1.netcom.ca%26rnum%3D1
og
http://groups.google.com/groups?q=ark%40research.att.com+union&hl=da&selm=yu
994rxm3ckk.fsf%40europa.research.att.com&rnum=5

Venlig hilsen

Mogens Hansen



Morten Guldager (05-02-2002)
Kommentar
Fra : Morten Guldager


Dato : 05-02-02 22:12

In article <3c5a6453$1@lxcs1.manbw.dk>, Mogens Hansen wrote:
>
> "Morten Guldager" <spamtrap@mogul.dk> wrote in message
> news:slrna5kjtc.kb1.spamtrap@guldager.uni.to...
>> In article <a3d9pt$12s$1@news.cybercity.dk>, Mogens Hansen wrote:
>> >
>> > "Morten Guldager" <spamtrap@mogul.dk> wrote in message
>> >>
>> >> Hvad med en union med en struct med bit felter?
>> >
>> > Der er ingen garanti for at det virker.
>>
>> Hvad skulle problemet være?
>
> At det er undefine behaviour i C og C++ og implementation-defined behaviour
> i C99.
> Det kan være at det virker, som du forventer. Det kan være at det ikke
> virker som du forventer.

Ok, Er det union der ikke virker, eller er det struct?

Jeg tror ikke helt jeg har fattet _hvad_ det er der strider mod standarden.

Er det også noget koks hvis jeg ikke bruger bit-felter?

Eller er det det at have en struct (eller flere) inden i en union?

> Det har været diskuteret en del gange på denne nyhedsgruppe.
> Se f.eks.
> http://groups.google.com/groups?hl=da&threadm=9grtmm%241q2v%241%40news.cyber
> city.dk&rnum=1&prev=/groups%3Fq%3Dmogens_h%2540dk-online.dk%2Bunion%26hl%3Dd
> a%26selm%3D9grtmm%25241q2v%25241%2540news.cybercity.dk%26rnum%3D1
> og hvis du ikke syntes det er tilstrækkeligt så se Andrew Köenig's
> forklaringer
> http://groups.google.com/groups?hl=da&threadm=2Oi95.24363%24qS3.52619%40tor-
> nn1.netcom.ca&rnum=1&prev=/groups%3Fq%3Dark%2540research.att.com%2Bunion%26h
> l%3Dda%26selm%3D2Oi95.24363%2524qS3.52619%2540tor-nn1.netcom.ca%26rnum%3D1
> og
> http://groups.google.com/groups?q=ark%40research.att.com+union&hl=da&selm=yu
> 994rxm3ckk.fsf%40europa.research.att.com&rnum=5

Tak, men jeg synes ikke rigtig jeg blev klogere. Altså, de skriver også bare
at det ikke virker, men ikke hvad der er ulovligt ved det.

Der stod noget med at hvis jeg skriver til et af felterne bliver de andre
udefinerede. Gælder det kun en struct med bit-felter?

Kom frisk, buk i neon og skær i pap....

Og ja, min erfaring med C er udelukkende praktisk, gcc og Linux. Jeg har aldrig
læst om skidtet med mindre jeg har haft et konkret problem.


/Morten

Mogens Hansen (05-02-2002)
Kommentar
Fra : Mogens Hansen


Dato : 05-02-02 23:06


"Morten Guldager" <spamtrap@mogul.dk> wrote in message

>
> Tak, men jeg synes ikke rigtig jeg blev klogere. Altså, de skriver også
bare
> at det ikke virker, men ikke hvad der er ulovligt ved det.
>

Se citaterne nedenfor en gang til.

<citat>
Assigning a value to an element of a union renders
all other elements of that union undefined.
<citat/>

og

<citat>
> En union er en måde hvor på man kan få flere basale datatype til, at bruge
> samme adresselager samtidig !!!
>
> Det vil sige at når du ændre en værdi i en af variablerne i din union, så
> ændre alle medlemmerne af din union værdi !!!
>

Strengt taget er det ikke rigtigt at alle medlemmerne ændrer værdi.
Det medlem der bliver assignet bliver aktivt og får en veldefinet værdi.
De andre medlemmer bliver ugyldige
<citat/>

Altså:
Når et element i en union tildeles en værdi, bliver samtlige andre elementer
i den union udefineret.
Hvis man alligevel læser nogle af de andre elementer har programmet
udefineret opførsel, hvilket kan være en hvilken som helst opførsel.

Hvis man tager din union

union
{
struct
{
int dyt:1;
int baat:1;
} bits;
int tal;
} hans;

så vil følgende være udefineret (jeg har ikke compileret det)

hans.tal = 7;
// hans.tal er veldefineret
// hans.bits er udefineret, og må ikke bruges
if(hans.bits.dyt) { // udefineret opførsel
// ...
}


> Og ja, min erfaring med C er udelukkende praktisk, gcc og Linux. Jeg har
aldrig
> læst om skidtet med mindre jeg har haft et konkret problem.
>

Enhver opførsel som du har observeret i brugen af en union, hvor man
tildeler et medlem og læser et andet, ligger inden for det tilladelige:
udefineret opførsel. Hvis f.eks. BIOS på dit grafikkort bliver slettet er
det også helt i overensstemmelse med hvad man kan forvente ud fra
sprogspecifikationen (helt seriøst, det er set som resultatet af undefined
behaviour).
Hvis dine programmer har den opførsel som du ønsker, er det fint for mig
(især hvis det ikke påvirker mig overhovedet), men det er ikke et godt råd
at give til andre at man skal basere sine programmer på udefineret opførsel.
Din opfattelse af hvordan union virker og kan bruges er meget almindelig -
det er netop derfor at det er vigtigt at påpege problemerne, og det er
derfor at det ofte er blevet diskutteret på forskellige nyhedsgrupper.

Venlig hilsen

Mogens Hansen



Morten Guldager (07-02-2002)
Kommentar
Fra : Morten Guldager


Dato : 07-02-02 11:26

In article <a3pkoq$1s7r$1@news.cybercity.dk>, Mogens Hansen wrote:
>
> "Morten Guldager" <spamtrap@mogul.dk> wrote in message
>
>> Tak, men jeg synes ikke rigtig jeg blev klogere. Altså, de skriver også
> bare
>> at det ikke virker, men ikke hvad der er ulovligt ved det.
>
> Se citaterne nedenfor en gang til.
>
><citat>
> Assigning a value to an element of a union renders
> all other elements of that union undefined.
><citat/>
>
> og
>
><citat>
>> En union er en måde hvor på man kan få flere basale datatype til, at bruge
>> samme adresselager samtidig !!!
>>
>> Det vil sige at når du ændre en værdi i en af variablerne i din union, så
>> ændre alle medlemmerne af din union værdi !!!
>>
>
> Strengt taget er det ikke rigtigt at alle medlemmerne ændrer værdi.
> Det medlem der bliver assignet bliver aktivt og får en veldefinet værdi.
> De andre medlemmer bliver ugyldige
><citat/>

Tak, nu tror jeg den er ved at være der. Det hjalp også noget at nærlæse
Kernighan & Richie.

Nu har jeg så bare et problem med et af mine programmer der i vid udstrækning
gør brug af en union til at holde IP adresser i.

Jeg skal både regne på IP adresserne som 32 bit integers og som 4 stk 8 bit
integers. Og de opstår som noget jeg har pillet ud af en char pointer.

Her var det jo "let" at bruge en union.

Hvordan gør jeg nu? (i disse union løse tider

Jeg er ikke den bedste ven med type casts. Jeg synes det forhindrer compileren
i at hjælpe mig.



/Morten

Igor V. Rafienko (07-02-2002)
Kommentar
Fra : Igor V. Rafienko


Dato : 07-02-02 13:37

[ Morten Guldager ]

[ snip ]

> Jeg skal både regne på IP adresserne som 32 bit integers og som 4
> stk 8 bit integers. Og de opstår som noget jeg har pillet ud af en
> char pointer.
>
> Her var det jo "let" at bruge en union.
>
> Hvordan gør jeg nu? (i disse union løse tider


inet_*, tenker jeg. Eller skal du ha konverteringsfunksjonene _veldig_
portabelt?





ivr
--
"ðÅpÅ×ÏÄ - ËÁË ÖÅÎÝÉÎÁ. åÓÌÉ ËpÁÓÉ×, ÔÏ ÎÅ×ÅpÅÎ, ÅÓÌÉ ×ÅpÅÎ, ÔÏ ÎÅËpÁÓÉ×."
      -- Crasher on <news:relcom.fido.ru.hacker>

Søg
Reklame
Statistik
Spørgsmål : 177500
Tips : 31968
Nyheder : 719565
Indlæg : 6408518
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste