[C++] Bit-Operatoren

User

Lt. Junior Grade
Registriert
März 2002
Beiträge
508
Ich bin gerade dabei C++ zu lernen. Hab im Moment ziemliche Probleme mit den Bit-Operatoren, die ich einfach net verstehe.
Kann mir dazu vielleicht einer ne Lösung sagen??

Schreiben Sie ein Programm, welches prüft, ob in einer einzulesenden Zahl n des Typs unsigned int das an der einzulesenden Position p (ebenfalls vom Typ unsigned int) befindliche Bit gesetzt ist. Wenn ja, wird true ausgegeben, andernfalls false. Zu Beginn gibt das Programm den für p zulässigen Wertebereich aus.

Zahl: >9 <RETURN>
Position (0..31): >3 <RETURN>
3.-tes Bit in 9 gesetzt? true
 
Re: C++ Hilfe

Könnte ich, ja.
Werde ich aber nicht... du musst das selbst lernen...
1.: Komm mit der Binärdarstellung klar... und lern, wie du nur mit Zettel und Stift dezimal in binär umwandelst (und umgekehrt).

2.: Bitoperationen.

2.a: Bitoperationen mit einer Bitmask.

2.a.I: NOT x: ~x
NOT kehrt alle Bits einer Zahl um. Gesetzte Bits werden gelöscht und umgekehrt.
Im Bereich der vorzeichenbehafteten Zahlen gilt: ~x == -(x+1)
0011010111011010 | x
1100101000100101 | ~x

2.a.II: SHL (SHift Left): x << n
SHL setzt jedes Bit in den Zustand, in dem das nächstniedrigwertigere Bit sich befand. Das least significant Bit wird mit 0 gesetzt.
Ein Leftshift um n Stellen entspricht im Prinzip einer Multiplikation um 2^n, allerdings fallen die vordersten Stellen weg, wenn das Ergebnis zu gross ist.
Es gilt: x << n == (x * pow(2^n)) % (2^BITS_IN_X)
0011000100100000 | x
0110001001000000 | x << 1
1100010010000000 | x << 2
1000100100000000 | x << 3

2.a.III: SHR (SHift Right): x >> n
SHR setzt jedes Bit in den Zustand, in dem das nächsthöherwertigere Bit sich befand. Das most significant Bit wird mit 0 gesetzt.
Ein Rightshift um n Stellen entspricht im Prinzip einer Division durch 2^n, wobei ein eventueller Rest wegfällt.
Im Bereich der nicht vorzeichenbehafteten Ganzzahlen gilt: x >> n == floor(x / 2^n)
100001100010010 | x
010000110001001 | x >> 1
001000011000100 | x >> 2

2.b: Bitoperationen mit zwei Bitmasks.

2.b.I: AND: x & y
Im Ergebnis sind nur die Bits gesetzt, die sowohl in x als auch in y gesetzt sind.
Es gilt: GESETZTE_BITS(x & y) <= MIN(GESETZTE_BITS(x),GESETZTE_BITS(y))
0111010010101010 | x
1001010111101011 | y
0001010010101010 | x & y

2.b.II: OR: x | y
Im Ergebnis sind alle Bits gesetzt, die in wenigstens einer der beiden Bitmasken gesetzt sind.
Es gilt: GESETZTE_BITS(x | y) >= MAX(GESETZTE_BITS(x),GESETZTE_BITS(y))
Falls gilt: x & y = 0, dann gilt zudem: x | y = x + y
0111010010101010 | x
1001010111101011 | y
1111010111101011 | x | y

2.b.II: XOR: x ^ y
Im Ergebnis sind nur die Bits gesetzt, die in x und y unterschiedlich sind. Stimmen die Bits von x und y überein ist das Bit im Ergebnis gelöscht.
Es gilt: x ^ y = ((x|y) & ~(x&y))
Falls gilt: x & y = 0, dann gilt zudem: x | y = x ^ y [= x + y]
0111010010101010 | x
1001010111101011 | y
1110000101000001 | x ^ y

Eigentlich sollte dir das für deine Aufgabe ausreichen.
 
Danke.
Sobald ich Zeit hab, mach ich daran mal weiter und versuch die Aufgabe zu lösen. Werd mich dann wieder melden. :)
 
Noch so als kleinene weiteren Tipp:
Es reichen dir: 1. / 2.a.I / 2.a.II / 2.b.I
 
Also ich muss echt sagen, die Bit-Operatoren machen mich wahnsinnig. Finde das net gerade einfach. Nachdem ich jetzt den ganzen Tag dran gesessen hab und meinen Vater noch ein Bisschen damit gequält hab (er kann nicht programmieren) bin ich zu folgendem Ergebnis gekommen:

Code:
#include <iostream>
using namespace std;

int main() {
	unsigned int n,p;
	cout << "Zahl: ";
	cin >> n;
	cout << "Position (0..31): ";
	cin >> p;
	cout << boolalpha
	     << p << ".-tes Bit in " << n << " ist gesetzt? " 
	     << ((n & (1<<p)) > 0) << endl;
	return 0;
}
 
Zurück
Oben