Bitmanipulation

Post Reply
Message
Author
User avatar
Lateralus
prolinux-forum-admin
Posts: 1238
Joined: 05. May 2004 7:35

Bitmanipulation

#1 Post by Lateralus »

Hallo C-ler

Ich wollte dann doch mal irgendwann die Sprache der Sprachen erlernen und beschäftige mich gerade mit Bit-Manipulation.

Ziel ist es, eine Funktion zu schreiben, die n Bits am Position p aus x durch die letzten n Bits in y ersetzt.

So sieht's bis jetzt aus:

Code: Select all

unsigned setbits(unsigned int x, int n, int p, unsigned int y){

	unsigned int mask;

	/* Zahl:	01001001
	 * Position:	76543210
	 * liefert n Bits von y ab 0
	 * Erzeugt dann eine Bitmaske mit allen Bits auf 0
	 * außer den ersten n, welche denen in y entsprechen.
	 */
	mask = &#40; y & ~&#40;~0 << n&#41;&#41;;

	/* Schiebt p Bits gleich 0 nach */
	mask << p;

	return x & mask;
&#125;
Ich bekome allerdings das warning: statement with no effect, welches sich auf die Zeile

mask << p;

bezieht.

Kann mir jemand das erklären?

User avatar
jochen
prolinux-forum-admin
Posts: 699
Joined: 14. Jan 2000 15:37
Location: Jülich
Contact:

#2 Post by jochen »

Der <<-Operator liefert Dir einen Wert zurück, der dem Inhalt von mask um p Bits linksgeshiftet entspricht. Du verwendest den Wert allerdings nicht! Bei den "normalen" Rechenoperatoren fällt so etwas schneller ins Auge: Wenn da einfach "a + b;" gestanden hätte, wäre die Warnung des Compilers direkt verstanden worden. Es muss also

Code: Select all

mask = mask << p;
heissen.

Jochen
Die grösste Lüge der EDV? "Mal eben..."

User avatar
Lateralus
prolinux-forum-admin
Posts: 1238
Joined: 05. May 2004 7:35

#3 Post by Lateralus »

thx!!!

Guest

#4 Post by Guest »

jochen wrote:Der <<-Operator liefert Dir einen Wert zurück, der dem Inhalt von mask um p Bits linksgeshiftet entspricht. Du verwendest den Wert allerdings nicht! Bei den "normalen" Rechenoperatoren fällt so etwas schneller ins Auge: Wenn da einfach "a + b;" gestanden hätte, wäre die Warnung des Compilers direkt verstanden worden. Es muss also

Code: Select all

mask = mask << p;
heissen.

Jochen
mask <<= p;

hätte auch gereicht :P

User avatar
Lateralus
prolinux-forum-admin
Posts: 1238
Joined: 05. May 2004 7:35

Bitmanipulation die zweite

#5 Post by Lateralus »

Schönen guten Morgen ;-)

Es geht immer noch um das gleiche Programm. Ich saß jetzt ein paar Tage nicht mehr dran... Der Befehl

Code: Select all

return x & mask;
oder auch

Code: Select all

return &#40; x & mask &#41;;
gibt 4 zurück, wenn x==4 und mask==6. Soweit ich die &-Operation verstanden habe, ist das falsch und es müsste eigentlich 6 zurückgegeben werden...

Kann mir jemand das erklären???

Tom2

#6 Post by Tom2 »

also ich habe das so verstanden:
4 ist 100
6 ist 110

4 & 6 ist dann 100 also 4!!

denn:
The bitwise-AND operator compares each bit of its first operand to the corresponding bit of its second operand. If both bits are 1, the corresponding result bit is set to 1. Otherwise, the corresponding result bit is set to 0.

Die Beschreibung stammt zwar aus der MS-Hilfe, aber das sollte doch ANSI-Standard sein, oder?

Gruss
Tom2

JochenAlsGast

#7 Post by JochenAlsGast »

Das Ergebnis 6 hättest Du bei einer OR-Verknüpfung erhalten:

100bin = 4dez
110bin = 6dez

Oder-Verknüpft (6 | 4) ergibt sich 110bin (2^0: 0|0=0, 2^1: 0|1=1, 2^2: 1|1=1) gleich 6dez.

Jochen
(der von einem öffentlichen Terminal aus postet und sein PW vergessen hat :( )

Tom2

#8 Post by Tom2 »

Das waere jetzt der ...
| The bitwise-inclusive-OR operator compares each bit of its first operand to the corresponding bit of its second operand. If either bit is 1, the corresponding result bit is set to 1. Otherwise, the corresponding result bit is set to 0.

Dann gibts noch den...
^ The bitwise-exclusive-OR operator compares each bit of its first operand to the corresponding bit of its second operand. If one bit is 0 and the other bit is 1, the corresponding result bit is set to 1. Otherwise, the corresponding result bit is set to 0.

womit dann 2dez oder 010bin rauskommen sollte.

Tom2

User avatar
Lateralus
prolinux-forum-admin
Posts: 1238
Joined: 05. May 2004 7:35

#9 Post by Lateralus »

Yo, vielen Dank euch allen. ;-)

Die Sache ist gelöst. ;-)

Don Philippe
Posts: 8
Joined: 14. May 2004 14:38

#10 Post by Don Philippe »

Giebts zum Thema Bitmanipulation ein schönes Tutorial im Netz?

MfG

Philipp

Post Reply