Brauche Hilfe bei bitweise Operatoren & boolsche Operatoren
-
Sagt den der Linker nicht, welche Symbole doppelt definiert wurden? Wir können da doch nur raten unhd wären somit keine Hilfe.
mfg Martin
-
borsalino schrieb:
asfdlol schrieb:
borsalino schrieb:
#define PRINT(int) printf("%d\n", int)LOL, darf ich fragen wo du "c++ lernst"?
FH Dortmund. Bin aber im Fachbereich Elektrotechnik, daher "Grundlagen". Ist die Zeile Code die du da zitierst so nicht in Ordnung? Sie ist vom Prof und zieht sich durch die ganzen Übungen altklausuren so durch.
1. ist das C und nicht C++. Ist zwar in C++ erlaubt, aber eben nicht C++.
2. Was noch viel schlimmer ist. Schlüsselworte sollten nicht in Bezeichner benutzt werden, auch wenn es beim Preprozessor noch erlaubt sein mag.
3. Der Hammer aber: Das Makro erzeugt falsche Ausgaben, wenn statt 'nem int was anderes übergeben wurde. Sowas programmieren nur Amateure.mfg Martin
-
borsalino schrieb:
asfdlol schrieb:
borsalino schrieb:
#define PRINT(int) printf("%d\n", int)LOL, darf ich fragen wo du "c++ lernst"?
FH Dortmund. Bin aber im Fachbereich Elektrotechnik, daher "Grundlagen". Ist die Zeile Code die du da zitierst so nicht in Ordnung? Sie ist vom Prof und zieht sich durch die ganzen Übungen altklausuren so durch.
nein, das ist bullshit, sorry.
1. wieso makro? was soll das bezwecken?
2. wieso printf? c++' std::cout ist typensicher und somit besser.borsalino schrieb:
asfdlol schrieb:
i & n = 0000 0000 (bin), ein bit ist nur 1 wenn diese stelle in n UND in i 1 ist
Ich glaub ich verstehe. Kann das Ergbnis mehr als 1 sein? Also dann z.B 1110 0011, 0011 1001 = 0010 0001 = 33 ?
exakt.
borsalino schrieb:
asfdlol schrieb:
i << n = 0000 0010 << 5 = 0100 0000 (bin), alles wurde um 5 stellen nach links geschoben
verstehe! Aber was passiert mit 0100 0110 ? Werden die drei 1 jeweils 5 nach links verschoben?
naja ein int hat per definition mindestens 16 bit. sollte man aber soweit schieben dass sie sogar aus dem bereich fallen, dann sind sie einfach weg. wenn du sie nach rechts schiebst, dann sind sie sofort weg.
borsalino schrieb:
asfdlol schrieb:
~i = ... 1111 1101 (bin), das ergebnis als dezimalzahl ist afaik implementierungabhängig, hier sieht es nach zweierkomplement aus, ja.
Da dran muss ich wohl noch sitzen...
die bitweise negation von integralen signed typen hab ich noch NIE gebraucht. keine ahnung wieso das abgefragt wird.
borsalino schrieb:
asfdlol schrieb:
bei &&, || und ! werden die operanden (die werte links und rechts) erstmal in bools konvertiert. wie werden integrale typen in bools konvertiert? genau: 0 = false, alles andere = true.
Also wie ich es mir dachte. Das Ergbnis kann nur einen true (1) oder false (0) Wert ausgeben.
ja.
borsalino schrieb:
asfdlol schrieb:
sorry, den zweiten code kommentiere ich nicht. ist mir zu unleserlich. jedenfalls ist das aber eine linker-meldung, keine compiler-meldung.
Das ist der Code einer offiziellen Übungsaufgabe vom Prof. Die anderen Übungen sowie Klasuren sehen alle so aus
.mein beileid.
-
mgaeckler schrieb:
Sagt den der Linker nicht, welche Symbole doppelt definiert wurden? Wir können da doch nur raten unhd wären somit keine Hilfe.
mfg Martin
Das ist die komplette Meldung
------ Erstellen gestartet: Projekt: lima, Konfiguration: Debug Win32 ------ Verknüpfen... test2.obj : error LNK2005: _wmain already defined in lima.obj C:\Users\Light tank\Documents\Visual Studio 2005\Projects\lima\Debug\lima.exe : fatal error LNK1169: one or more multiply defined symbols found Das Buildprotokoll wurde unter "file://c:\Users\Light tank\Documents\Visual Studio 2005\Projects\lima\lima\Debug\BuildLog.htm" gespeichert. lima - 2 Fehler, 0 Warnung(en) ========== Erstellen: 0 erfolgreich, Fehler bei 1, 0 aktuell, 0 übersprungen ==========Ich benutze Visual C++ 2005 Express Edition, da der Prof den in den Übungen benutzt.
mgaeckler schrieb:
1. ist das C und nicht C++. Ist zwar in C++ erlaubt, aber eben nicht C++.
2. Was noch viel schlimmer ist. Schlüsselworte sollten nicht in Bezeichner benutzt werden, auch wenn es beim Preprozessor noch erlaubt sein mag.
3. Der Hammer aber: Das Makro erzeugt falsche Ausgaben, wenn statt 'nem int was anderes übergeben wurde. Sowas programmieren nur Amateure.Das erklärt vielleicht auch warum ich die Übungen so nicht verstanden habe... Mhh muss ich halt durch.
Könnt ihr mir kurz diese beiden Zeilen erklären:
PRINT(m = i | n); //Ergebnis=7,
PRINT(m = i ^ n); //Ergebnis=7,Grüße
-
borsalino schrieb:
Könnt ihr mir kurz diese beiden Zeilen erklären:
PRINT(m = i | n); //Ergebnis=7,
PRINT(m = i ^ n); //Ergebnis=7,Grüße
stell dir die beiden variable wieder als binärmuster vor:
i = 2 = 0000 0010 (bin)
n = 5 = 0000 0101 (bin)| bedeutet bitweise-oder
i | n = 0000 0111 (bin), im ergebnis ist das bit dann 1, wenn es in i ODER in n 1 ist.^ bedeutet biweise-exklusiv-oder
i ^ n = 0000 0111 (bin), im ergebnis ist das bit dann 1, wenn es in i Oder in n 1 ist, nicht aber wenn es in beiden 1 ist.
also:
0^0 = 0
1^0 = 1
0^1 = 1
1^1 = 0
-
borsalino schrieb:
Das ist die komplette Meldung
------ Erstellen gestartet: Projekt: lima, Konfiguration: Debug Win32 ------ Verknüpfen... test2.obj : error LNK2005: _wmain already defined in lima.obj C:\Users\Light tank\Documents\Visual Studio 2005\Projects\lima\Debug\lima.exe : fatal error LNK1169: one or more multiply defined symbols found Das Buildprotokoll wurde unter "file://c:\Users\Light tank\Documents\Visual Studio 2005\Projects\lima\lima\Debug\BuildLog.htm" gespeichert. lima - 2 Fehler, 0 Warnung(en) ========== Erstellen: 0 erfolgreich, Fehler bei 1, 0 aktuell, 0 übersprungen ==========Ich benutze Visual C++ 2005 Express Edition, da der Prof den in den Übungen benutzt.
Ich nehme mal an, daß lima.cpp und test2.cpp jeweils der Quelltext eines Programmes ist und in beiden eine Mainfunktion definiert wurde. Erstelle für test2.cpp ein eigenes Projekt und linke es nicht zusammen mit lima.cpp. Wenn ich falsch liege, dann entferne eine von beiden Definitionen.
mfg Martin
-
asfdlol schrieb:
stell dir die beiden variable wieder als binärmuster vor:
i = 2 = 0000 0010 (bin)
n = 5 = 0000 0101 (bin)| bedeutet bitweise-oder
i | n = 0000 0111 (bin), im ergebnis ist das bit dann 1, wenn es in i ODER in n 1 ist.wenn i= 1010 1010, n = 0101 0101, dann ist i | n = 1111 1111 ?
asfdlol schrieb:
^ bedeutet biweise-exklusiv-oder
i ^ n = 0000 0111 (bin), im ergebnis ist das bit dann 1, wenn es in i Oder in n 1 ist, nicht aber wenn es in beiden 1 ist.
also:
0^0 = 0
1^0 = 1
0^1 = 1
1^1 = 0ok auch verstanden!
Zu den Shift Operatoren:
wenn i=2, n=50 per integer definiert sind.
was passiert dann mit i << n? Ergebnis: 524288
Wenn ich also die 2 (was ja in binär 2^1 entspricht) 50 stellen nach links verschiebe habe ich ja eigentlich 2^51, was aber nicht als Ergebnis stimmen kann. Was mach ich falsch?
Grüße
-
borsalino schrieb:
asfdlol schrieb:
stell dir die beiden variable wieder als binärmuster vor:
i = 2 = 0000 0010 (bin)
n = 5 = 0000 0101 (bin)| bedeutet bitweise-oder
i | n = 0000 0111 (bin), im ergebnis ist das bit dann 1, wenn es in i ODER in n 1 ist.wenn i= 1010 1010, n = 0101 0101, dann ist i | n = 1111 1111 ?
genau.
borsalino schrieb:
Zu den Shift Operatoren:
wenn i=2, n=50 per integer definiert sind.
was passiert dann mit i << n? Ergebnis: 524288
Wenn ich also die 2 (was ja in binär 2^1 entspricht) 50 stellen nach links verschiebe habe ich ja eigentlich 2^51, was aber nicht als Ergebnis stimmen kann. Was mach ich falsch?
Grüße
der wert auf der rhs bei den shift- und shift-assign-operatoren darf nicht grösser sein als die anzahl bit des typs der lhs. wenn doch, dann hast du ub.
-
mgaeckler schrieb:
Ich nehme mal an, daß lima.cpp und test2.cpp jeweils der Quelltext eines Programmes ist und in beiden eine Mainfunktion definiert wurde. Erstelle für test2.cpp ein eigenes Projekt und linke es nicht zusammen mit lima.cpp. Wenn ich falsch liege, dann entferne eine von beiden Definitionen.
mfg Martin
habe bei der test2.cpp int main() statt int _tmain(int argc, _TCHAR* argv[]) eingefügt und es funktioniert. Die lima.cpp habe ich so belassen. Danke!
Wir ihr seht habe ich die grundlegenden Dinge in C++ nicht drauf.

-
asfdlol schrieb:
der wert auf der rhs bei den shift- und shift-assign-operatoren darf nicht grösser sein als die anzahl bit des typs der lhs. wenn doch, dann hast du ub.
Kannst du mir das bitte etwas ausführlicher erklären und ohne Abkürzungen? bin schon ganz durcheinander

Gruß
-
borsalino schrieb:
asfdlol schrieb:
der wert auf der rhs bei den shift- und shift-assign-operatoren darf nicht grösser sein als die anzahl bit des typs der lhs. wenn doch, dann hast du ub.
Kannst du mir das bitte etwas ausführlicher erklären und ohne Abkürzungen? bin schon ganz durcheinander

Gruß
lhs = left hand side
rhs = right hand side
ub = undefined behaviourwas ich damit sagen wollte:
wenn du x << y oder x >> y schreibst, dann muss y kleiner sein als x bits hat. wenn x ein int ist und auf deinem system 32 bit hat, dann muss y < 32 sein.
-
asfdlol schrieb:
lhs = left hand side
rhs = right hand side
ub = undefined behaviourwas ich damit sagen wollte:
wenn du x << y oder x >> y schreibst, dann muss y kleiner sein als x bits hat. wenn x ein int ist und auf deinem system 32 bit hat, dann muss y < 32 sein.Ok verstehe. y muss also immer kleiner sein als die anzahl der bits von x.
Nun in meinem Beispiel war "y" ja viel größer (50) als x (2). Und ich bin auf einem Win7 32bit System.
Wieso hat das Programm dennoch ein Ergebnis ausgespuckt und wieso? Wieso nichgt 0? Was kann ich mir unter dem undefined behaviour vorstellen?
Vielen Dank für die Geduld mit mir

Gruß
-
borsalino schrieb:
Wieso hat das Programm dennoch ein Ergebnis ausgespuckt und wieso? Wieso nichgt 0?
das war zufall. das programm hätte auch 0 ausgeben können oder theoretisch auch die festplatte formatieren dürfen. du hast etwas gemacht was nicht erlaubt ist sondern ub hervorruft. was dann passiert während das programm ausgeführt wird kann dir keiner sagen. wie gesagt, zufall.
borsalino schrieb:
Was kann ich mir unter dem undefined behaviour vorstellen?
genau so. unvorhersehbare, undurchschaubare und undeterministische resultate / vorgänge.
-
asfdlol schrieb:
das war zufall. das programm hätte auch 0 ausgeben können oder theoretisch auch die festplatte formatieren dürfen. du hast etwas gemacht was nicht erlaubt ist sondern ub hervorruft. was dann passiert während das programm ausgeführt wird kann dir keiner sagen. wie gesagt, zufall.
borsalino schrieb:
Was kann ich mir unter dem undefined behaviour vorstellen?
genau so. unvorhersehbare, undurchschaubare und undeterministische resultate / vorgänge.
Ok ich hab fast alles was ich wissen wollte. Schonmal vielen Dank, dass du dir die Zeit & Mühe auf dir genommen hast mir das zu erklären.
Ein kleine Frage noch zu den Shift Operatoren bevor du dich von mir genervt fühlst: Wenn das Ergebnis zufällig ist, da sie unvorhersehbar sind, wieso kommt immer das selbe Ergebnis beim Ausführen des Programms? Müsste da nicht jedesmal eine andere Zahl da stehen?
Grüße
-
borsalino schrieb:
Ein kleine Frage noch zu den Shift Operatoren bevor du dich von mir genervt fühlst: Wenn das Ergebnis zufällig ist, da sie unvorhersehbar sind, wieso kommt immer das selbe Ergebnis beim Ausführen des Programms? Müsste da nicht jedesmal eine andere Zahl da stehen?
dann ist es eben zufall, dass jedesmal das selbe (falsche) rauskommt. darauf verlassen darfst du dich dennoch nicht. mit den shift-operatoren alleine hat dies aber wenig zu tun. es gibt auch sonst undefiniertes verhalten in c++.
-
asfdlol schrieb:
borsalino schrieb:
Ein kleine Frage noch zu den Shift Operatoren bevor du dich von mir genervt fühlst: Wenn das Ergebnis zufällig ist, da sie unvorhersehbar sind, wieso kommt immer das selbe Ergebnis beim Ausführen des Programms? Müsste da nicht jedesmal eine andere Zahl da stehen?
dann ist es eben zufall, dass jedesmal das selbe (falsche) rauskommt. darauf verlassen darfst du dich dennoch nicht. mit den shift-operatoren alleine hat dies aber wenig zu tun. es gibt auch sonst undefiniertes verhalten in c++.
Ok, danke!