[C / C++] bits copieren uit een int

Pagina: 1
Acties:

  • Boxed
  • Registratie: Januari 2002
  • Laatst online: 19-08 18:58

Boxed

Is een vliegtuig...

Topicstarter
Om een data frame bestaande uit 2 bytes uit te lezen moet ik dus een aantal bits copieren naar een andere int, is daar een routine voor in C?
Met schuiven zou het ook moeten kunnen, maar hoe vang ik dan de bits die je er uit schuift op in een andere int?

Om te voorkomen dat men met de meest ingenieuze en ingewikkelde dingen komt, ik ben niet bepaald een expert in C, maar alle hulp is welkom. ;)

A good landing is one from which you can walk away. A great landing is one after which you can still use your airplane


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-08 13:19

.oisyn

Moderator Devschuur®

Demotivational Speaker

je bent op de hoogte van bitwise operators? (&, |, ^ )

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.


  • Reptile209
  • Registratie: Juni 2001
  • Laatst online: 11:00

Reptile209

- gers -

C:
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!


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-08 13:19

.oisyn

Moderator Devschuur®

Demotivational Speaker

doe dan:
C++:
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.


  • Reptile209
  • Registratie: Juni 2001
  • Laatst online: 11:00

Reptile209

- gers -

.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;
}
Is idd wat korter (sneller?), maar ik heb 'm juist een stukje verder uitgeschreven om het hopelijk wat inzichtelijker te maken voor een beginner O-).
En bovendien: * Reptile209 heeft al in geen maanden meer een C-compiler opgestart :P behalve waarschijnlijk achter de schermen bij een Mandrake-install...

Zo scherp als een voetbal!


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 21-08 17:14
.oisyns code is beter. Er wordt feitelijk om een wiskundig stukje code gevraagd, en dat is wat .oisyns code doet. Wat jouw code doet is vergelijkbaar met
code:
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


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

En als het constant hetzelfde blokje bits is kennen C en C++ ook gewoon bitfields, al of niet nuttig gecombineerd met unions, bijv.:
C++:
1
2
3
4
5
6
7
8
9
10
union
{
  struct
  {
  unsigned      HighBits : 5;
  unsigned      MidBits  : 6;
  unsigned      LowBits  : 5;
  };
  short ValueAsAWhole;
};

Professionele website nodig?


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-08 13:19

.oisyn

Moderator Devschuur®

Demotivational Speaker

anonymous structs zijn overigens geen standaard C/C++ :)

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.


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

Correct, maar gaat om het idee :)

Professionele website nodig?


  • GrimaceODespair
  • Registratie: December 2002
  • Laatst online: 10:32

GrimaceODespair

eens een tettenman, altijd ...

Als je een beetje uit de voeten kunt met templates: er zit een handige bitset class in de STL. Hier kun je bijvoorbeeld het volgende mee doen:
C++:
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


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-08 13:19

.oisyn

Moderator Devschuur®

Demotivational Speaker

GrimaceODespair schreef op 21 May 2003 @ 10:31:
Zelf ben ik een beetje tegen custom gebitneuk, omdat het je code meestal onleesbaar maakt.
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.

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.


  • GrimaceODespair
  • Registratie: December 2002
  • Laatst online: 10:32

GrimaceODespair

eens een tettenman, altijd ...

.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
offtopic:
Ik voel mij enigszins persoonlijk aangesproken en betutteld... doch dat is geheel subjectief :P

[ Voor 8% gewijzigd door GrimaceODespair op 21-05-2003 11:33 ]

Wij onderbreken deze thread voor reclame:
http://kalders.be


  • Exirion
  • Registratie: Februari 2000
  • Nu online

Exirion

Gadgetfetisjist

Bitneuken is lekker :9 Veel lekkerder dan mieren en komma's :Y)

[/offtopic]

"Logica brengt je van A naar B, verbeelding brengt je overal." - Albert Einstein


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-08 13:19

.oisyn

Moderator Devschuur®

Demotivational Speaker

GrimaceODespair schreef op 21 mei 2003 @ 11:33:
[...]
offtopic:
Ik voel mij enigszins persoonlijk aangesproken en betutteld... doch dat is geheel subjectief :P
ik had het sowieso over het algemeen, en jij bent meer dan 2 jaar ouder dan ik (als je profile klopt iig ;)). Goed, dat jij het niet leesbaar vind moet je zelf weten, ik verwijt je niets... n00b! :P ;)

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.

Pagina: 1