A good landing is one from which you can walk away. A great landing is one after which you can still use your airplane
Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.
1
2
3
4
5
6
| int getBit(int value, int bit) { if (value & (1 << bit)) return 1 else return 0 } |
(owja, de bits dus van "rechts" naar "links" tellen (van LSB naar MSB), beginnen bij bit 0).
Niet getest, maar het principe moge duidelijk zijn. Met a << b "schuif" je a naar rechts met b plaatsen (b bijvoorbeeld tussen 0 en 7 voor een byte). Dat komt overeen met 2^b (2 tot de macht b).
Met & (AND) wordt vergeleken of in a en b dezelfde bit(s) 1 is (zijn). Zo ja, dan komt die waarde eruit, zo nee, dan is dat nul. Vb (binair):
100 & 10 = 0
100 & 100 = 100.
1100 & 100 = 100.
Zo iets dus. Maar ik zou er eerlijk gezegd even een boekje over (inleidend) C(++) bij pakken, want zo schiet je niet echt op
[ Voor 17% gewijzigd door Reptile209 op 20-05-2003 17:55 ]
Zo scherp als een voetbal!
1
2
3
4
| int getBit (int value, int bit) { return (value >> bit) & 1; } |
Verder kun je de bitwise operatoren zien als een bewerking op een getal met een bepaalde mask.
De or operator (getal | mask) zet alle bits in getal op 1 waar ook een 1 in mask staat.
De and operator (getal & mask) laat alleen die bits in getal op 1 waar ook een 1 in mask staat.
De xor operator (getal ^ mask) zet alle bits om waar een 1 in mask staat (dus een 1 wordt een 0 en omgekeerd)
Als je dus getal 3 bits naar rechts wil shiften, maar de 3 uitgeshifte bits wilt bewaren, dan kun je die dus verkrijgen door het getal te and'en met 00000111
Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.
Is idd wat korter (sneller?), maar ik heb 'm juist een stukje verder uitgeschreven om het hopelijk wat inzichtelijker te maken voor een beginner.oisyn schreef op 20 mei 2003 @ 18:06:
doe dan:
C++:
1 2 3 4 int getBit (int value, int bit) { return (value >> bit) & 1; }
En bovendien: * Reptile209 heeft al in geen maanden meer een C-compiler opgestart
Zo scherp als een voetbal!
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| int add( int l, int r )
{
if ( l == 0 )
{
if ( r == 0 )
return 0;
else if ( r == 1 )
return 1;
else // ...
}
else if ( l == 1 )
{
//...
} |
Je introduceert branches (if-statements) waar dat helemaal niet nodig is. Het is niet overeenkomstig het probleem - logischerwijs zijn er geen twee verschillende gevallen - en bovendien veel langzamer.
Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein
1
2
3
4
5
6
7
8
9
10
| union { struct { unsigned HighBits : 5; unsigned MidBits : 6; unsigned LowBits : 5; }; short ValueAsAWhole; }; |
Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.
1
2
3
4
5
6
7
| // Maak een 'byte' (8 bits) aan met de waarde 3 bitset<8> bs( 3 ); // Geef elke bit uit de byte weer for( int i = (int) bs.size(); i >= 0; i-- ) { cout << bs[i] << " "; } |
(c) www.cppreference.com
Het is waarschijnlijk niet optimaal (als in: 3D spellen), maar de meeste templates zijn dermate geoptimaliseerd dat de eventuele (zeer beperkte) performance hits niet opwegen tegen de voordelen van onderhoudbaarheid.
Zelf ben ik een beetje tegen custom gebitneuk, omdat het je code meestal onleesbaar maakt.
[ Voor 13% gewijzigd door GrimaceODespair op 21-05-2003 10:32 ]
Wij onderbreken deze thread voor reclame:
http://kalders.be
Dat is nogal subjectief. De meeste programmeurs van de oude garde, en ook wel de meeste gamedevvers, weten precies wat er staat en wat er bedoeld wordt.GrimaceODespair schreef op 21 May 2003 @ 10:31:
Zelf ben ik een beetje tegen custom gebitneuk, omdat het je code meestal onleesbaar maakt.
De nieuwere idd niet, aangezien die het bitneuken nooit echt nodig hebben gehad, omdat de snelheidswinst daarvan tegenwoordig relatief nihil is
Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.
.oisyn schreef op 21 mei 2003 @ 10:42:
De meeste programmeurs van de oude garde, en ook wel de meeste gamedevvers, weten precies wat er staat en wat er bedoeld wordt.
De nieuwere idd niet, aangezien die het bitneuken nooit echt nodig hebben gehad
Ik voel mij enigszins persoonlijk aangesproken en betutteld... doch dat is geheel subjectief
[ Voor 8% gewijzigd door GrimaceODespair op 21-05-2003 11:33 ]
Wij onderbreken deze thread voor reclame:
http://kalders.be
Bitneuken is lekker.oisyn schreef op 21 mei 2003 @ 10:42:
het bitneuken
[/offtopic]
"Logica brengt je van A naar B, verbeelding brengt je overal." - Albert Einstein
ik had het sowieso over het algemeen, en jij bent meer dan 2 jaar ouder dan ik (als je profile klopt iigGrimaceODespair schreef op 21 mei 2003 @ 11:33:
[...]
offtopic:
Ik voel mij enigszins persoonlijk aangesproken en betutteld... doch dat is geheel subjectief
Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.