Forum: PC-Programmierung C - Bitweise Operation - Aus Buch KR


von Alexander (Gast)


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

von Daniel (Gast)


Lesenswert?

Führende 0 beschreibt eine Oktalzahl. Basis = 8

von Carl D. (jcw2)


Lesenswert?

0177_octal -> 0x10 -> 0b10000000

Zu der Zeit als das festgelegt wurde, gab es 12, 18 oder auch 36-Bit 
Maschinen, da sind 2, 3 oder 6 Oktalstellen nicht mehr so schräg.

: Bearbeitet durch User
von (prx) A. K. (prx)


Lesenswert?

Carl D. schrieb:
> 0177_octal -> 0x10 -> 0b10000000

War wohl ein anstrengender Tag heute.

0177 = 0b01111111 = 0x7F

: Bearbeitet durch User
von g457 (Gast)


Lesenswert?

0177 == 0b1111111 == 0x7F == 127

von Carl D. (jcw2)


Lesenswert?

A. K. schrieb:
> Carl D. schrieb:
>> 0177_octal -> 0x10 -> 0b10000000
>
> War wohl ein anstrengender Tag heute.
Stimmt!   ;-)

> 0177 = 0b01111111 = 0x7F

: Bearbeitet durch User
von Alexander (Gast)


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ß,

von Theor (Gast)


Lesenswert?

Du interpretierst die Zahl "0177" falsch.

Siehe das selbe Buch, Kapitel 2.3, Seite 37

"Beginnt eine ganzzahlige Konstante mit 0 (Null), so wird sie in Basis 8 
interpretiert; ..."

von PittyJ (Gast)


Lesenswert?

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.

von HildeK (Gast)


Lesenswert?

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 ...

von Alexander (Gast)


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ß,

von zitter_ned_aso (Gast)


Lesenswert?

Ich glaube nicht dass so ein altes Buch heutzutage benutzt werden 
sollte. Ja, irgendwann mal ein paar mal überfliegen. Aber nicht als ein 
Anfänger aus dem Jahre 2018.

Was soll man heutzutage mit dem Code

main(){

}

denn anfangen?



Hier ist z.B. ein kostenloses Buch.

"C von A bis Z"


http://openbook.rheinwerk-verlag.de/c_von_a_bis_z/

von zitter_ned_aso (Gast)


Lesenswert?

Als "das Buch" kann ich

"C Primer Plus"

 von Stephen Prata empfehlen. Das Buch hat 1000 Seiten!

von Peter S. (Gast)


Lesenswert?

PittyJ schrieb:
> Ist ja cool, dass noch jemand K&R liest.

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.

von Alexander (Gast)


Lesenswert?

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?

Gruß,

von Roland F. (rhf)


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.

von (prx) A. K. (prx)


Lesenswert?

Roland F. schrieb:
> Das Problem bei K&R ist eher die Tatsache, das es fast 30 Jahre alt ist

Falls die Ausgabe von 1988 gemeint ist, nicht die von 1978. ;-)

von Roland F. (rhf)


Lesenswert?

Hallo,

A. K. schrieb:
> Falls die Ausgabe von 1988 gemeint ist...

Davon bin ich jetzt einfach mal ausgegangen.

rhf

von Dirk B. (dirkb2)


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.

von Roland F. (rhf)


Lesenswert?

Hallo,
Dirk B. 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.

rhf

von Fehlerhaft (Gast)


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.

von A. S. (Gast)


Lesenswert?

Fehlerhaft schrieb:
> Wenn der Rest des Buchs eine ähnliche Qualität hat, wie dieses Kapitel,
> dann ist es unbrauchbar.

Woran störst Du Dich denn. An den 64Bit? Oder gar an den 36? Für einen 
Anfänger als Ausflug in die "es ist nicht alles 4 Byte was int ist"-Welt 
ist das für mich OK.

von Rolf M. (rmagnus)


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.

von g457 (Gast)


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

von (prx) A. K. (prx)


Lesenswert?

So ähnlich. Analog zu "long long int" für 64 Bits bei LLP64 (Windows) 
gibts dann eben bei ILP64 "short short int" für 16 Bits und "long short 
int" für 32 Bits. Dieses Prinzip ist beliebig ausbaufähig.

: Bearbeitet durch User
von zitter_ned_aso (Gast)


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.

von zitter_ned_aso (Gast)


Lesenswert?

Und? Ist diese Funktion richtig oder falsch?

von (prx) A. K. (prx)


Lesenswert?

Schrott, und zwar gleich doppelt.

: Bearbeitet durch User
von (prx) A. K. (prx)


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.

von Walter K. (vril1959)


Lesenswert?

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.

Was ist denn daran traurig?

von zitter_ned_aso (Gast)


Lesenswert?

"The strtok() function uses a static buffer while parsing"

https://www.systutorials.com/docs/linux/man/3-strtok/


Kann diese Aussage die Lösung sein?

von zitter_ned_aso (Gast)


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.

von (prx) A. K. (prx)


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.

: Bearbeitet durch User
von zitter_ned_aso (Gast)


Lesenswert?

Also bei Dir funktioniert diese Implementierung nicht?

von (prx) A. K. (prx)


Lesenswert?

Deine Hartnäckigkeit in Ehren, aber wenn du so weiter fragst, solltest 
du dich auf Stricken verlegen. Oder auf Freitage.

: Bearbeitet durch User
von Yalu X. (yalu) (Moderator)


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.

von Philipp Klaus K. (pkk)


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).

: Bearbeitet durch User
von Dirk B. (dirkb2)


Lesenswert?

Philipp Klaus K. schrieb:
>  Aber wenn ich eine Frage zu C habe, lese ich
> normalerweise den Standard (zur Zeit N2310).

Der ist ja noch weniger geeignet C zu lernen.

Wenn man C gut kann, dann ist der Standard ok.

von Dirk B. (dirkb2)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.