C - Bitweise Operation - Aus Buch KR

Gast #5641638
Lesenswert?

Hi,

in einem anderen Thread wurde mir bereits sehr gut geholfen, deshalb 
möchte ich erneut noch mal um Hilfe bitten.

Aus dem Kernighan & Ritchie Buch über C, Kapitel 2.9 auf Seite 48:
"The bitwise AND operator & is often used to mask off some set of bits; 
for example
1
n = n & 0177;
sets to zero all but the low-order 7 bits of n."

Das habe ich versucht nachzurechnen/verstehen, scheitere dabei aber. Ich 
bin mir nicht sicher, was 0177 bedeutet, interpretiere es aber als die 
Zahl 177.

177_dec = 0000000010110001_b

Wenn ich jetzt eine beliebige Zahl n mit 0000000010110001_b 
AND-verknüpfe, kann ich nicht sehen, inwiefern die Aussage "sets to zero 
all but the low-order 7 bits of n." stimmt. Die oberen 8 bits von 177 
sind alle 0. Das verstehe ich. Da sind aber auch Nullen in den unteren 7 
bits vorhanden, was diejenigen Bits in n ebenfalls löschen würden.

Missverstehe ich die 0177 Schreibweise aus dem Buch?

Danke
Gast #5641881
Lesenswert?

Vielen Dank euch allen. Fun fact:
Das steht sogar an anderer/voriger Stelle im Buch:
"A leading zero on an integer constant means octal;"

Das scheint mir gestern beim Lesen untergegangen zu sein.

Das wird ein langer Weg für mich... :D

Vielen Dank für eure Hilfe.

Gruß,
Gast #5642106
Lesenswert?

HildeK schrieb:
> PittyJ schrieb:
>> Ist ja cool, dass noch jemand K&R liest.
>> Ich werde immer doof angeschaut, wenn ich den erwähne. Aber vor 30
>> Jahren war es das einzige Buch.
>
> Ich greife auch danach, wenn ich ein Verständnisproblem habe. Es ist
> mein einziges C-Buch ...

Hi PittyJ und HildeK,
ich lese den K&R, weil er in vielen Foren bezüglich C hoch gelobt wird. 
Allerdings weiß ich (noch) nicht, ob ich den Hype für dieses Buch 
nachvollziehen kann. Es ist sicherlich ein gutes Buch, keine Frage. Aus 
pädagogischer Sicht würde ich mir allerdings einiges im Buch anders 
wünschen, da mir als Anfänger bei vielen (scheinbar wichtigen) Sätzen 
entsprechende Beispiele fehlen. So ist es oftmals, dass ich die 
Wichtigkeit bestimmter Sätze nicht erkenne, weil eben dieser Satz 
einfach nur als ein Satz neben vielen Sätzen steht, der dann 10 Seiten 
später ohne Vorwarnung/Erläuterung in einem Beispiel verwendet wird.

Beispiel:
Im Buch bis Seite 48 wurde kaum bis gar nicht auf die binäre 
Schreibweise eingegangen, obwohl es die Grundlage für die 
Zahlendarstellung auf Computern ist, und entsprechend sehr wichtig fürs 
Verstehen der bitweisen Operationen
1
n = n&0177;
.
Für einen Anfänger wäre es sicherlich hilfreich, drei Sätze und ein 
detailiertes Beispiel dafür zu verwenden, den Satz "sets to zero all but 
the low-order 7 bits of n" verständlicher zu machen.

Hätte ich vor einigen Jahren nicht bereits die Artikel über 
Bitmanipulation hier auf uC.net gelesen, wäre ich nicht auf die Idee 
gekommen, die Zahlen ins binäre System umzuwandeln und dann eine AND 
Verknüpfung auf Papier durchzuführen.

Aber ja, der K&R bleibt erstmal meine Primärreferenz und 
Internetartikel/Youtube als weiterführende Quelle.

Wie seht ihr das? Mich würde eure Meinung diesbezüglich interessieren.

Gruß,
#5642195
Lesenswert?

Hallo,

zitter_ned_aso schrieb:
> Das Buch hat 1000 Seiten!

Die Qualität eines Buches bemisst sich nicht nach der Anzahl seiner 
Seiten!

rhf

P.S.:
Das Problem bei K&R ist eher die Tatsache, das es fast 30 Jahre alt ist 
und seit dem nicht mehr überarbeitet wurde. Trotzdem halte ich es für 
eines der besten Lehrbücher die ich bisher gelesen habe. Aber es fehlt 
halt was in der Zwischenzeit dazu gekommen ist und einige Dinge sind 
(wie z.B. die oktale Zahlendarstellung) überholt.
#5642255
Lesenswert?

Der K&R ist nicht für absolute Programmieranfänger geeignet.

Es ist aber die Referenz für C.

Die zweite Ausgabe beschreibt auch schon ANSI-C (C89)
Die Neuerungen danach sind aber kein Problem, da es keine großartigen 
Änderungen an der Sprache gab.

Das vorgeschlagene online Buch hat zuviele Fehler.
Gast #5642334
Lesenswert?

Roland F. schrieb:
>> Das vorgeschlagene online Buch hat zuviele Fehler.
>
> Das Buch kenne ich zwar nicht, aber ich habe mir mal ein anderes Buch
> dieses Autor gekauft (Grundkurs C) und mir auch andere Bücher von ihm
> angesehen. Ich kann diesen Autor nicht empfehlen.

Kurz reingeschaut und direkt einen Fehler gefunden:

http://openbook.rheinwerk-verlag.de/c_von_a_bis_z/005_c_basisdatentypen_002.htm#mj05627afe3c1e67ed50a71e2429f9aadb

>Ein int hat somit laut Standard die natürliche Größe, die von der 
»Ausführ-Umgebung« vorgeschlagen wird. Das wären dann z. B. auf einer 
PDP10-Maschine 36 Bit, auf einem Pentium 4 32 Bit und auf einem beliebigen 
64-Bit-Prozessor-System eben 64 Bit.

Wenn der Rest des Buchs eine ähnliche Qualität hat, wie dieses Kapitel, 
dann ist es unbrauchbar.
#5642424
Lesenswert?

A. S. schrieb:
> Woran störst Du Dich denn. An den 64Bit?

Vermutlich. Die Behauptung, auf 64-Bit-Systemen sei ein int immer 64 Bit 
breit, ist ziemlich falsch. Tatsächlich ist ein 64-bittiger int eher 
unüblich.
Tatsächlich ist es in C so, dass int der natürlichen Breite der 
Plattform entsprechen sollte, erzwingt das aber nicht. Bei 
64-Bit-Plattformen weicht man davon ab, weil sonst nicht mehr genügend 
kleinere Typen übrig sind.
Gast #5642441
Lesenswert?

> Bei 64-Bit-Plattformen weicht man davon ab, weil sonst nicht mehr
> genügend kleinere Typen übrig sind.

..ich wollte schon immer Datentypen wie 'damn short int' und 'longish 
short int' haben ;-)

SCNR
Gast #5642509
Lesenswert?

Als Fehler wird in den Foren eher das angesehen:


http://openbook.rheinwerk-verlag.de/c_von_a_bis_z/012_c_zeiger_006.htm#mj1d0c139ec6125f198a762880b480283f

Abschnitt 12.6.1

char *eingabe(char *str) {
   char input[MAX];

   printf("Bitte \"%s\" eingeben: ",str);
   fgets(input, MAX, stdin);
   return strtok(input, "\n");
}


Einfach den String einlesen und ohne '\n'-Zeichen zurückgeben. Wobei 
input[MAX] ein lokales Array ist.
#5642540
Lesenswert?

(1) Der Witz ist, dass der Autor sogar selbst auf diesen Fehler 
hinweist: "Doch Vorsicht, Folgendes funktioniert nicht:". Nur hat er 
keine Ahnung, wie strtok arbeitet, und macht exakt diesen Fehler selbst.

(2) Wird so viel eingegeben, dass es fürs Newline nicht reicht, gibt 
strtok NULL zurück, die aufrufende Funktion rechnet aber nicht damit.
Gast #5642561
Lesenswert?

Walter K. schrieb:
> Was ist denn daran traurig?

Na ja, wenn einer sagt "Ich fahre einen VW und suche eine 
Reparaturanleitung" dann wird wohl kaum jemand mit dem Satz kommen wie 
"Lies mal das Reparaturbuch für den VW-Käfer aus dem Jahre 1955 durch".

30 Jahre im IT-Bereich? Das ist doch eine Ewigkeit.
#5642563
Lesenswert?

zitter_ned_aso schrieb:
> Kann diese Aussage die Lösung sein?

Die klassische Implementierung von strtok verwendet keinen separaten 
Puffer, sondern modifiziert den übergebenen String. Der Aufruf von 
strtok sucht also nach dem \n, schreibt dort \0 rein und übergibt die 
Adresse von input[]. Macht also exakt das, von dem er schreibt, dass das 
ein Fehler ist.

Es hilft allerdings sehr, die Implementierung von strtok mal gesehen zu 
haben, denn man muss manche Doku von strtok schon sehr gründlich lesen, 
um das zu erkennen. Findest du es hier?
http://www.cplusplus.com/reference/cstring/strtok/

Da der zweite Aufruf (hier nicht verwendet) kein input[] kriegt, sondern 
NULL, hat strtok ein eigene statische Variable, die nach dem ersten 
Aufruf auf die Stelle hinter dem reingeschriebenen \0 zeigt. Es ist 
diese Variable, die strtok nicht tread-safe macht, und zu strtok_r 
führte. Nicht der String selbst.
Moderator #5642620
Lesenswert?

zitter_ned_aso schrieb:
> Na ja, wenn einer sagt "Ich fahre einen VW und suche eine
> Reparaturanleitung" dann wird wohl kaum jemand mit dem Satz kommen wie
> "Lies mal das Reparaturbuch für den VW-Käfer aus dem Jahre 1955 durch".

Auf C bezogen ist der aktuelle VW baugleich mit dem Käfer von 1955, nur
dass noch Sicherheitsgurte und eine dritte Bremsleuchte hinzugekommen
sind.

Die Reparaturanleitung von 1955 wurde von den Entwicklern des Käfers
höchstpersönlich in einem klaren und eindeutigen Stil verfasst, setzt
allerdings voraus, dass der Leser weiß, wie herum eine Schraube aus- und
eingedreht wird. Will man den Sicherheitsgurt oder die dritte
Bremsleuchte reparieren (beiden gehen aber nur selten kaputt), muss man
sich die Anleitung dazu leider aus anderer Quelle (bspw. im Internet)
besorgen.

Der Autor der aktuellen Version hat leider keinen so tiefen Einblick in
die Technik des Käfers, was man der Anleitung anmerkt. Dafür geht er
auch auf die neu hinzugekommenen Fahrzeugteile ein und behandelt
Grundlagenthemen wie bspw. den Unterschied zwischen Recht- und
Linksgewinden bei Schrauben, eine Beschreibung der zu den verschiedenen
Schraubenköpfen passenden Werkzeugen u.v.m. Das lässt die Dicke des
Buchs auf ein Vielfaches anschwellen.

Am Ende muss jeder selber entscheiden, welche der beiden Anleitungen er
bevorzugt.
#5642623
Lesenswert?

Alexander schrieb:
> Peter S. schrieb:
>> Eher traurig, dass es heute noch Menschen gibt die mit K&R C lernen. Als
>> historisches Dokument ganz nett, aber C hat sich nun mal weiter
>> entwickelt.
>
> Welches Buch würdest du denn empfehlen?

"Modern C" von Jens Gustedt ist recht gut. Aber eventuell nicht ganz 
anfängergeeignet. Aber wenn ich eine Frage zu C habe, lese ich 
normalerweise den Standard (zur Zeit N2310).
#5642747
Lesenswert?

Fehlerhaft schrieb:
> Kurz reingeschaut und direkt einen Fehler gefunden:
>
> 
http://openbook.rheinwerk-verlag.de/c_von_a_bis_z/005_c_basisdatentypen_002.htm#mj05627afe3c1e67ed50a71e2429f9aadb
>
>>Ein int hat somit laut Standard die natürliche Größe, die von der
> »Ausführ-Umgebung« vorgeschlagen wird. Das wären dann z. B. auf einer
> PDP10-Maschine 36 Bit, auf einem Pentium 4 32 Bit und auf einem
> beliebigen
> 64-Bit-Prozessor-System eben 64 Bit.

Im weiteren Verlauf geht der Autor aber immer von Vielfachen von 8 Bit 
aus.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren