---
title: "BIT-relaterade operatorer"
type: "forum-thread"
url: "https://www.webforum.nu/amne/c-cpp/105134-bit-relaterade-operatorer"
topic: "C/C++"
topic_url: "https://www.webforum.nu/amne/c-cpp"
author: "peewee"
published: "2004-06-06T17:59:54.000Z"
updated: "2004-06-07T15:11:43.000Z"
replies: 4
views: 218
page: 1
pages: 1
language: "sv-SE"
site: "webForum — webforum.nu"
rights: "Upphovsrätten till varje inlägg tillhör dess författare."
attribution: "Citera som: webForum, https://www.webforum.nu/amne/c-cpp/105134-bit-relaterade-operatorer"
---

# BIT-relaterade operatorer

## #1 — peewee, 2004-06-06T17:59Z

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... =)

Permalänk: https://www.webforum.nu/p/105134

## #2 — GunnarD, 2004-06-06T20:50Z

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.

Permalänk: https://www.webforum.nu/p/1362066

## #3 — peewee, 2004-06-06T21:47Z

Ok, tack för hjälpen!

Permalänk: https://www.webforum.nu/p/1362131

## #4 — spango, 2004-06-06T22:35Z

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.

Permalänk: https://www.webforum.nu/p/1362177

## #5 — peewee, 2004-06-07T15:11Z

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... =)

Permalänk: https://www.webforum.nu/p/1362481

---

Tråden på webben: https://www.webforum.nu/amne/c-cpp/105134-bit-relaterade-operatorer
