Hi Leute,
angenommen, wir hätten einen Integerwert, beispielsweise 'int i = 36;'
und wollen herausfinden, welche binären Bits gesetzt sind.
Die Zahl 5 beispielsweise, sieht binär so aus: 0000000000000101 - also
sind 2 Bits gesetzt. Kann mir da jemand weiterhelfen?
Vielen Dank schonmal im vorraus!
--
Daniel Feist
Abend Kam noch keine Antwort oder ging keine in die Mail-Liste?
angenommen, wir hätten einen Integerwert, beispielsweise 'int i = 36;' und wollen herausfinden, welche binären Bits gesetzt sind. Die Zahl 5 beispielsweise, sieht binär so aus: 0000000000000101 - also sind 2 Bits gesetzt. Kann mir da jemand weiterhelfen?
Was ist das Ziel, also welche Verwendung ist beabsichtigt? Und welche Programmiersprache? Wenn Du beispielsweise wissen willst, ob ein bestimmtes Bit gesetzt ist, tut's ein simpler logischer Vergleich. Ist z.B. i & 4 wahr, so ist das dritte bit von rechts gesetzt. Willst Du zählen, wieviele gesetzt sind, dann fällt mir nichts anderes ein, als die Stellen der Zahl in einer Schleife durchzugehen. Also mit Potenzen von zwei logisch zu verknüpfen oder die Zahl kontiniuerlich durch zwei zu teilen bzw. binär nach rechts zu schieben (die meisten Programmiersprachen haben dafür einen Operator, meistens >> ). Bye -- 1 Bodo Kaelberer 123 http://www.webkind.de/ http://www.kaelberer-aio.de/ 3 Seelig sind die, die da arm an Geist sind, denn sie werden 4 sich Christlich Soziale Union nennen.
So, hab das Programm mal geschrieben (sogar mit Kommentar :) ) !
Das Programm ist in C++ geschrieben.
#include<iostream>
using namespace std;
int main( void )
{
int zahl, zaehler, potenz = 1; //Deklaration der benötigten Variablen
zahl = zaehler = 0;
cout<<"Zahl eingeben: "; // Einlesen der auf die Anzahl der
gesetzten Bits zu untersuchenden Zahl
cin >> zahl;
while( (zahl-potenz) > 0 ) potenz *= 2; // die größtmögliche 2er-Potenz
herausfinden, die in die
// eingegebene Zahl hineinpasst
potenz /= 2; // Potenz auf die nächst niedrigere 2er-Potenz verringern, da
// der letzte Schleifen-Durchlauf die Potenz nochmal
(einmal zu oft) erhöht hat
while(zahl >= 0 && potenz != 0)
{
if ( (zahl - potenz) >= 0 ) // wenn die Zahl minus der 2er-Potenz
größer oder gleich 2 ist
{ // ,dann subtrahiere die 2er-Potenz von der Zahl und erhöhe den
zahl -= potenz; // Zähler (den Zähler der gesetzten Bits)
um 1
zaehler++;
}
potenz /= 2; // Potenz auf die nächst niedrigere 2er-Potenz verringern
}
cout<<"Es sind "<
Marcel Reckers schrieb am 05.04.2005 00:24 :
So, hab das Programm mal geschrieben (sogar mit Kommentar :) ) ! Das Programm ist in C++ geschrieben.
Hast du mal -1 eingegeben? Dein Programm liefert bei mir seltsamerweise 0. Meine Funktion liefert hingegen korrekterweise 32. So viel zur Korrektheit deines Programms. Dass es auch noch kürzer geht, hat David Haller ja eben bewiesen ;-) Michael
Hallo, Am Sun, 03 Apr 2005, Daniel Feist schrieb:
Hi Leute, angenommen, wir hätten einen Integerwert, beispielsweise 'int i = 36;' und wollen herausfinden, welche binären Bits gesetzt sind. Die Zahl 5 beispielsweise, sieht binär so aus: 0000000000000101 - also sind 2 Bits gesetzt. Kann mir da jemand weiterhelfen?
In welcher Programmiersprache? In der shell: $ for i in 5 36; do echo $[ `echo "obase=2; $i;" | bc | tee /dev/stderr \ | sed 's/0//g' | wc -c` -1 ]; \ done 101 2 100100 2 Noch Fragen? -dnh -- Es wäre schon wünschenswert, wenn die DAUs das Stück toten Baum, was mit der Suse mitkommt, nutzen würden. Entweder zum Lesen, oder um sich damit so lange auf den Schädel zu hauen, bis die Kollegen vom RD anrücken müssen. -- Hauke Heidtmann in feuerwehrmann.talk
Hi Daniel!
Ich gebe meinen Senf in C++ auch noch dazu:
#include <iostream>
#include
Das ist aber ganz schön aufwendig, findest du nicht ? Nichts gegen das Programm, das funktioniert ja, aber es geht wirklich kürzer und einfacher.
Marcel Reckers schrieb am 05.04.2005 01:37 :
Das ist aber ganz schön aufwendig, findest du nicht ?
Was ist aufwendig? Könntest du konkreter werden, was du genau meinst?
Nichts gegen das Programm, das funktioniert ja, aber es geht wirklich kürzer und einfacher.
Was genau geht kürzer? Seit wann misst man die Effizienz von Code an der Zeilenanzahl? Meiner Meinung nach ist der Code sehr effizient und auch nicht allzu lang. - Du hast ja die gleiche Funktion wie meine Funktion countSetBits() gepostet, die mehr Zeilen benötigt. Kritik ist willkommen, aber dann bitte sehr speziell: Was gefällt nicht? Warum gefällt es nicht? Verbesserungsvorschläge? Michael
Hallo, Am Tue, 05 Apr 2005, Marcel Reckers schrieb:
Das ist aber ganz schön aufwendig, findest du nicht ? Nichts gegen das Programm, das funktioniert ja, aber es geht wirklich kürzer und einfacher.
Das musst gerade du sagen. Fuer C++ gibt es <bitset>. ==== UNGETESTET (nur teils aus dem Stroustrup abgeschrieben) ==== #include <bitset> #include <iostream> using namespace std; #define N 32 int main(void) { bitset<N> b = 5; // oder bitset<N> b; cout << "zahl: "; cin >> b; int bitsset; for(register unsigned int i = 0; i < N; i++) { if( b[i] ) { bitsset++; } } cout << bitsset << endl; return 0; } ==== <bitset> bietet diverse interessante Operationen an. -dn'*GNA*'h -- Auch wieder richtig, aber zum bloed posten brauch ich kein Hirn. Ausserdem tipp ich schneller, als ich denke :). -- Klaus Muth
Hallo
#include <bitset> #include <iostream>
using namespace std;
Wo unterrichtet man denn dieses "using namespace std;" ? Der Namensbereich std hat man zur Unterscheidung zwischen eigenen Funktionen und Variablen und der standard Bibliothek eingeführt. #include <iostream> int main( int argc, char* argv[] ) { const int x = 42; for( int i = sizeof(x)*8-1; i >= 0; i-- ) { std::cout << ((x & (2< 0); } std::cout << std::endl; return 0; } Bis auf die Ausgabe ist das eine reine C Lösung.
#define N 32
int main(void) { bitset<N> b = 5; // oder bitset<N> b; cout << "zahl: "; cin >> b; int bitsset; for(register unsigned int i = 0; i < N; i++) { if( b[i] ) { bitsset++; } } cout << bitsset << endl; return 0; }
Das ist eher ein C++ Ansatz, jedoch deutet die for Schleife und viel schlimmer
das #define noch auf den eingefleischten C Programmierer hin. Wenn schon die
STL dann richtig:
#include <iostream>
#include <bitset>
int main( int argc, char* argv[] )
{
const int x = 42;
std::bitset
Hallo, Am Tue, 05 Apr 2005, Tobias Erbsland schrieb:
#include <bitset> #include <iostream>
using namespace std;
Wo unterrichtet man denn dieses "using namespace std;" ?
Keine Ahnung. Bei mir ist es schlichte Tippfaulheit. Das mach ich aber auch nur mit std [1]. [..]
Das ist eher ein C++ Ansatz, jedoch deutet die for Schleife und viel
s.u.
schlimmer das #define noch auf den eingefleischten C Programmierer hin.
"#define" kann auch mit C++ sehr sinnvoll sein ;)
int main( int argc, char* argv[] ) { const int x = 42;
std::bitset
x_bits( x ); std::cout << "Number of bits set: " << x_bits.count() << std::endl; ^^^^^^^^ das hatte ich auf die Schnelle nicht gesehen. Ich wollte auch nur auf <bitset> hinweisen. Danke fuer die Ergaenzung.
-dnh [1] wobei das mit meinem alten g++ / libstdc++ eh "Pflicht" ist, denn auch ohne das 'using namespace std;' ist std "importiert"... -- "We must do something. This is something. Therefore we must do this." -- Military and Corporate Logic
Moin moin, Am Dienstag, 5. April 2005 08:10 schrieb Tobias Erbsland:
using namespace std;
Wo unterrichtet man denn dieses "using namespace std;" ? Der Namensbereich std hat man zur Unterscheidung zwischen eigenen Funktionen und Variablen und der standard Bibliothek eingeführt.
Wenn Du schon am Klugscheissen bist, dann richtig!
int main( int argc, char* argv[] ) ^^^^^^^^^^^ int main(int,char**)
Benötigst Du diese Variablen, mit den entsprechenden Kompiler-Schaltern bekommst Du das nicht kompiliert! So! *SCNR* Ciao Andre
Hallo
(...) Wenn Du schon am Klugscheissen bist, dann richtig!
int main( int argc, char* argv[] ) int main(int,char**) Benötigst Du diese Variablen, mit den entsprechenden Kompiler-Schaltern bekommst Du das nicht kompiliert! So! *SCNR*
Ich eben auch nicht :-) Gruss Tobias
On Sunday 03 April 2005 18:16, Daniel Feist wrote:
Hi Leute, angenommen, wir hätten einen Integerwert, beispielsweise 'int i = 36;' und wollen herausfinden, welche binären Bits gesetzt sind. Die Zahl 5 beispielsweise, sieht binär so aus: 0000000000000101 - also sind 2 Bits gesetzt. Kann mir da jemand weiterhelfen?
Vielen Dank schonmal im vorraus!
Hallo Google is your friend: http://groups-beta.google.com/group/comp.lang.c++/browse_frm/thread/aace268b... In ein Programm gegossen, zum Bleistift: #include <iostream> int bitcount(unsigned n) { int count = 0; while (n) { n &= (n-1); ++count; } return count; } int main(int argc, char **argv) { if (argc != 2) { std::cout << "Usage " << argv[0] << " number\n"; return -1; } std::cout << "bitcount(" << argv[1] << ") = " << bitcount(atoi(argv[1])) << "\n"; return 0; } Gruß Norbert
participants (8)
-
Andre Heine
-
Bodo Kaelberer
-
Daniel Feist
-
David Haller
-
Marcel Reckers
-
Michael Wenger
-
Norbert Müller
-
Tobias Erbsland