Hypercell ein ] Hypercell aus ] Zeige Navigation ] Verstecke Navigation ]
c++.de  
   

Die mobilen Seiten von c++.de:
http://m.c-plusplus.de
Infos hier [BETA]

  
c++.de :: C++ (auch C++0x und C++11) ::  Hilfe bei Aufgabe aus "Der C++ Programmierer"     Zeige alle Beiträge auf einer Seite Auf Beitrag antworten
Autor Nachricht
Neuling._
Unregistrierter




Beitrag Neuling._ Unregistrierter 20:51:46 19.06.2012   Titel:   Hilfe bei Aufgabe aus "Der C++ Programmierer"            Zitieren

Hallo

Ich lerne gerade C++ mit dem Buch Der C++ Programmier von Ulrich Breymann.
Leider habe ich schon bei der zweiten Aufgabe nicht verstanden was man genau machen muss.
Kann mir das jemand genauer erklären ?

Zitat:
Schreiben Sie ein Programm, das die grösstmögliche unsigned int Zahl(int, long, unsigned long) ausgibt, ohne dass die Kenntnis der systeminternen verwendeten Bitanzahl für jeden Datentyp benutzt wird. Hinweis: studieren Sie die möglichen Operatoren für ganze Zahlen und die Datei limits.h


Das ist die Lösung:
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/* cppbuch/loesungen/k1/2.cpp
   Beispiel zum Buch von Ulrich Breymann: Der C++ Programmierer; Hanser Verlag
   Diese Software ist freie Software. Website zum Buch: http://www.cppbuch.de/
*/

#include<iostream>
using namespace std;
 
int main() {
   unsigned int ui = 0;
   unsigned long int uli = 0;
   cout << "max. unsigned int     = "<< ~ui       << endl;
   cout << "max. unsigned long int= "<< ~uli      << endl;
   cout << "max. int              = "<< (~ui>>1)  << endl;
   cout << "max. long int         = "<< (~uli>>1) << endl;
}


Ich verstehe auch nicht genau was eine bitweise Negation ist.
Es ist dieses Zeichen -> ~
Im Buch wurde es nicht genau erklärt nur kurz angegeben.
Die Lösung verstehe ich nur wenig. Vor allem das Zeichen ~ und ">> 1" nicht.
Es wäre nett wenn mir jemand ein wenig helfen könnte.


Vielen Dank
IrgendeinName
Mitglied

Benutzerprofil
Anmeldungsdatum: 21.05.2012
Beiträge: 163
Beitrag IrgendeinName Mitglied 21:35:40 19.06.2012   Titel:              Zitieren

C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <bitset>
#include <iostream>
 
using std::cout;
using std::bitset;
 
int main()
{
   
    long int l = 0;
    bitset<32> longset(l);
    cout << longset.to_string() << '\n';
    longset = ~longset;
    cout << longset.to_string() << '\n';
    cout << longset.to_ulong() << '\n';
   
}



Führ einmal dieses Programm aus. Es zeigt dir was der Operator ~ mit einer Zahl macht. (Normalerweise würde einen unsigned long nehmen, aber VC++ hat da einen Bug).

Hier nochmal erklärt:
Das ist eine Binärzahl:
0000 0000 = 0 Dezimal.
Wenn wir Bitweises-Nicht mit der Zahl machen, wird jede 0 zu eins und jede 1 zu 0.

~(0000 0000) = 1111 1111 = 255
~(1111 1111) = 0000 0000 = 0

Der >> Operator shiftet Bits = verändert die Position.
Wenn du eine signed (vorzeichenbehaftete) Zahl hast, wird das linkste (= erste Bit) der Zahl für den negativen Wert verwendet. Wenn du also den maximalen Wert haben willst, muss das erste Bit weg, nachdem du es bitwise geNOTet hast.
Wenn du >> 1 auf 1111 1111 machst, wird es zu 0111 1111
Wenn du >> 1 auf 0110 0000 machst, wird es zu 0011 0000


Zuletzt bearbeitet von IrgendeinName am 21:39:51 19.06.2012, insgesamt 1-mal bearbeitet
Neuling._
Unregistrierter




Beitrag Neuling._ Unregistrierter 22:19:24 19.06.2012   Titel:              Zitieren

Vielen Dank !
Ich glaube ich habe es jetzt verstanden.
Aber wie krieg ich die grösstmögliche einer int raus ?

So habe ich es versucht:
C++:
int a = 0;
a = (~a>>1);


Da krieg ich -1.
1111 1111 1111 1111 1111 1111 = -1
Neuling._
Unregistrierter




Beitrag Neuling._ Unregistrierter 22:34:24 19.06.2012   Titel:              Zitieren

Ich muss eine 0 'reinschieben', deswegen kam immer 1111 1111 statt 0111 1111.
Stimmt das so ?

C++:
int a;
a = (~a>>0)
out
Unregistrierter




Beitrag out Unregistrierter 08:03:53 20.06.2012   Titel:              Zitieren

Neuling._ schrieb:
Aber wie krieg ich die grösstmögliche einer int raus ?
z.B. so:
C++:
int i = 1;
= ~(i << (sizeof(int)*8-1));
cout << "max. int = "<< i;



An dieser Stelle kann man auch noch erwähnen, dass unsigned short int=0 negiert meist -1 liefert:
Zitat:
A prvalue of an integer type other than bool, char16_t, char32_t, or wchar_t whose integer conversion
rank (4.13) is less than the rank of int can be converted to a prvalue of type int if int can represent all
the values of the source type.
Zitat:
The rank of any unsigned integer type shall equal the rank of the corresponding signed integer type.
Zitat:
The rank of a signed integer type shall be greater than the rank of any signed integer type with a
smaller size.
Beispiel:
C++:
unsigned short int ui = 0;
// unsigned short int --> integral promotion --> int
cout << "max. unsigned short int = "<< ~ui; // int i=0 negiert ergibt -1.
Neuling._.
Unregistrierter




Beitrag Neuling._. Unregistrierter 08:53:50 20.06.2012   Titel:              Zitieren

[quote="out"] z.B. so:
C++:
int i = 1;
= ~(i << (sizeof(int)*8-1));
cout << "max. int = "<< i;


[quote]

Danke ich glaube ich habe es verstanden.
Mit sizeof(int) kriegt man die systeminterne Grösse von int raus (2 oder 4 byte), mit 8 multipliziert um in bits umzurechnen - 1 und verschiebt die Bits so um 15/ 31 stellen.
Danach bekommt man die grösste negative und muss noch die Zahl negieren ?
Ist das so richtig ?
Wutz
Mitglied

Benutzerprofil
Anmeldungsdatum: 15.04.2010
Beiträge: 2689
Beitrag Wutz Mitglied 08:54:57 20.06.2012   Titel:              Zitieren

Neuling._ schrieb:

Aber wie krieg ich die grösstmögliche einer int raus ?


C++:
1
2
3
4
5
6
7
8
9
10
11
#include <limits>
std::numeric_limits<int>::max()
 
oder

#include <climits>

INT_MAX
 
oder
 
(unsigned int)-1>>1

_________________
Java, the best argument for Smalltalk since C++. -- Frank Winkler
daddy_felix
Mitglied

Benutzerprofil
Anmeldungsdatum: 11.01.2012
Beiträge: 598
Beitrag daddy_felix Mitglied 09:21:50 20.06.2012   Titel:              Zitieren

out schrieb:
Neuling._ schrieb:
Aber wie krieg ich die grösstmögliche einer int raus ?
z.B. so:
C++:
int i = 1;
= ~(i << (sizeof(int)*8-1));
cout << "max. int = "<< i;



hm...
Zitat:
ohne dass die Kenntnis der systeminternen verwendeten Bitanzahl für jeden Datentyp benutzt wird


Zuletzt bearbeitet von daddy_felix am 09:22:02 20.06.2012, insgesamt 1-mal bearbeitet
c++.de :: C++ (auch C++0x und C++11) ::  Hilfe bei Aufgabe aus "Der C++ Programmierer"   Auf Beitrag antworten

Zeige alle Beiträge auf einer Seite




Nächstes Thema anzeigen
Vorheriges Thema anzeigen
Sie können Beiträge in dieses Forum schreiben.
Sie können auf Beiträge in diesem Forum antworten.
Sie können Ihre Beiträge in diesem Forum nicht bearbeiten.
Sie können Ihre Beiträge in diesem Forum nicht löschen.
Sie können an Umfragen in diesem Forum nicht mitmachen.

Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme

c++.de ist Teilnehmer des Partnerprogramms von Amazon Europe S.à.r.l. und Partner des Werbeprogramms, das zur Bereitstellung eines Mediums für Websites konzipiert wurde, mittels dessen durch die Platzierung von Werbeanzeigen und Links zu amazon.de Werbekostenerstattung verdient werden kann.

Die Vervielfältigung der auf den Seiten www.c-plusplus.de, www.c-plusplus.info und www.c-plusplus.net enthaltenen Informationen ohne eine schriftliche Genehmigung des Seitenbetreibers ist untersagt (vgl. §4 Urheberrechtsgesetz). Die Nutzung und Änderung der vorgestellten Strukturen und Verfahren in privaten und kommerziellen Softwareanwendungen ist ausdrücklich erlaubt, soweit keine Rechte Dritter verletzt werden. Der Seitenbetreiber übernimmt keine Gewähr für die Funktion einzelner Beiträge oder Programmfragmente, insbesondere übernimmt er keine Haftung für eventuelle aus dem Gebrauch entstehenden Folgeschäden.