Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (GNU/Linux, *NIX, *BSD und Co) » Einzelne Bits lesen / setzen

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
27.10.2011, 18:09 Uhr
Spongy



Heyho,

Ich arbeite momentan an einem kleinen Gameboy Emulator in C++ mit SDL.
Ich habe allerdings momentan ein Problem.

Ich möchte die einzelnen Bits aus z.B. einem unsigned char (u8) auslesen.
Momentan benutze ich dafür diese Funktionen:


C++:
u8 RegisterSet::getBit(int bitNum, u8 variable)
{
    return variable & (1 << bitNum-1);
}

u8 RegisterSet::setBit(u8 Variable, int bitNum, u8 newValue)
{
    Variable |= newValue<<bitNum;
    return Variable;
}



Allerdings scheint das nicht so ganz zu funktionieren.
Die Möglichkeiten, die einzelnen Bits zu lesen oder zu setzen habe ich durchs googeln gefunden, aber es funktioniert nicht wirklich

Hat jemand vielleicht eine Idee?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
27.10.2011, 18:58 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


naja bei getBit fehlt auf erstem blick noch ein "(variable & ...) >> bitNum" (damit du halt 1 oder 0 bekommst, und nicht "iwas anderes")

bzw ein:


C++:
bool RegisterSet::getBit(int bitNum, u8 variable)
{
    return (variable & (1 << bitNum-1)) != 0;
}



sollte ausreichen
--
class God : public ChuckNorris { };

Dieser Post wurde am 27.10.2011 um 19:00 Uhr von FloSoft editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
27.10.2011, 23:59 Uhr
0xdeadbeef
Gott
(Operator)


Zwei Dinge: Zum einen musst du bitNum in beiden Funktionen gleich behandeln, d.h. entweder beide male bitNum - 1 rechnen und die Bits 1-8 nennen oder beide male nackt bitNum verwenden und die Bits 0-7 nennen. Ich empfehle letzteres; ist bei Arrays ja auch nicht anders. Zum zweiten wirst du mit binärem Oder allein nicht ein bestimmtes Bit auf 0 setzen können.

Machen könnte man das beispielsweise so:

C++:
#include <iostream>

typedef unsigned char u8;

bool get_bit(u8 var, unsigned n) {
  return (var >> n & 1) == 1;
}

// Per Referenz übergebener erster Parameter wird hier geändert.
// Falls das nicht gewollt ist, ist das aber natürlich leicht zu ändern.
void set_bit(u8 &var, unsigned n, bool new_val) {
  u8 mask = ~(u8(1) << n);
  var = (var & mask) | (new_val << n);
}

void binprint(u8 x) {
  for(int i = 0; i < 8; ++i) {
    std::cout << unsigned(get_bit(x, i));
  }
  std::cout << '\n';
}

int main() {
  u8 x = 12;

  binprint(x);
  set_bit(x, 4, 1);
  binprint(x);
  set_bit(x, 3, 0);
  binprint(x);
  set_bit(x, 0, 1);
  binprint(x);
}


--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (GNU/Linux, *NIX, *BSD und Co) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: