webForumDet fria alternativet

BIT-relaterade operatorer

4 svar · 200 visningar · startad av peewee

peeweeMedlem sedan juni 20043 inlägg
#1

Jag sitter och läser lite kod som hanterar en matris

members (["alpha":20,"beta":34,"charlie":28,"delta":44,"echo":82,])

vidare finns definitionerna

#define M_APPRENTICE 2
#define M_MAGE 4
#define M_MASTER 8
#define M_NECRO 16
#define M_CONJU 32
#define M_BANISH 64

I funktionen remove_master(mixed player) händer följande:

members[player] -= (members[player] & M_MASTER);

Vad gör den raden egentligen? Drar den bort M_MASTER (alltså 8) från player i matrisen (så "charlie" blir 20) eller tar den bort "charlie" helt och hållet?

Vidare, i funktionen add_master(mixed player,string school) så händer följande bl.a.

members[player] |= M_MASTER;
members[player] |= M_MAGE;
members[player] -= (members[player] & M_APPRENTICE);

Vad sjutton gör den? Jag gissar på att den sätter bitarna M_MASTER och M_MAGE till true och nollar M_APPRENTICE, men har jag rätt?

Jag vill inte gärna rota i koden och prova, eftersom den kompileras och körs i realtid av spelarna, och det finns inga andra admins påloggade just nu... söker bara ett snabbt svar... =)

GunnarDMedlem sedan juni 20014 290 inlägg
#2

Re: BIT-relaterade operatorer

peewee skrev:

members[player] -= (members[player] & M_MASTER);

Om man delar upp den lså bli det följande:

members[player] & M_MASTER : Detta blir M_MASTER om den bitten är satt annars 0.

Sedan utförs
members[player] = members[player] - "resultatet ovan".

Vilket medför att den noll ställer M_MASTER bitten.

Man skulle kunna skriva:
members[player] &= !M_MASTER;

peewee skrev:

members[player] |= M_MASTER;
members[player] |= M_MAGE;
members[player] -= (members[player] & M_APPRENTICE);

Vad sjutton gör den? Jag gissar på att den sätter bitarna M_MASTER och M_MAGE till true och nollar M_APPRENTICE, men har jag rätt?

Helt riktigt.

peeweeMedlem sedan juni 20043 inlägg
#3

Ok, tack för hjälpen!

spangoMedlem sedan juni 20008 205 inlägg
#4

Re: Re: BIT-relaterade operatorer

GunnarD skrev:

Man skulle kunna skriva:
members[player] &= !M_MASTER;

Men man borde skriva members[player] &= ~M_MASTER; eftersom ! är en logisk och inte bitvis operator ;) Samma sak gäller för minustecknet. Använd de operatorer som är avsedda för bitoperationer. Vidare, om du använder C++ (och inte C) kan det vara värt att veta att vector<bool> använder en specialiserad implementation som gör att den arbetar med bitsets i stället för arrayer.

peeweeMedlem sedan juni 20043 inlägg
#5

Jag ställde frågan här eftersom språket jag använder (LPC) mest liknar C/C++. Jag vet inte särskilt mycket om C/C++ i sig... =)

132 ms totalt · 3 externa anrop · v20260731065814-full.30151723
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
130 ms — hämta tråd, inlägg och bilagor (db)