PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : bitverschiebung C



korax
25-10-2003, 12:23
Hallo.
Ich will bit vergleiche machen.

Testen welche bits in einem Byte gesetzt sind und wie viele.
Ich habe folgende Funktion geschrieben.

Aber es geht natürlich nicht und ich möchte gerne wissen warum.




t = 20;

for(i = 0; i < 8; ++i)
{
if ( t & (1 << n)) // != 0 = true
{
++zaehler1;
n = n * 2;
}
else ++zaehler1;
}

printf(" zaehler1\t = %i\n", zaehler1);
printf(" n\t\t = %i\n", n);



Hier sollte folgendes Passiert sein.!

If ( WERT von t Bitweise UND verknüpft mit n ) dann zähler++ ( wie viele bit´s gesetzt sind ).
n mal 2 um weiter zu schieben und nächste bit stelle zu prüfen.

Wo liegen meine Fehler

Danke !!

Till
:confused:

wraith
25-10-2003, 12:44
Du hast in deinem Codeschnipsel die wichtigsten Deklarrationen nicht gepostet,aber egal.
Einmal wird bei dir in jedem Schleifendurchlauf zaehler1 inkrementiert,und die if-Bedingung ist etwas falsch.


int t = 10;
int zaehler1 = 0;
int n = 1;
for(int i = 0; i < 8; ++i)
{
if (t & n)
++zaehler1;
n <<= 1;
}

printf(" zaehler1\t = %i\n", zaehler1);
printf(" n\t\t = %i\n", n);

oder kürzer,falls du weißt,daß dein System im 2er-Komplement arbeitet


size_t bitcount(unsigned int nr)
{
size_t res = nr != 0;
while(nr &= (nr - 1))
res++;
return res;
}

anda_skoa
25-10-2003, 12:45
Wenn du das 1 Bit immer eine Stelle weiter verschieben willst, solltest du den Verschiebefaktor nicht verdoppeln.
Dadurch lässt du alle ungeraden Bitpositionen aus.



1 << i

wäre da zielführender, außer du willst nur die geraden Positionen testen, dann sollte aber die Schleife kürzer sein.

Ciao,
_

korax
25-10-2003, 13:26
Danke erstmal für die schnellen Antworten

die systax der oben genannten If abfrage kommt von hier

http://www.kip.uni-heidelberg.de/Computerpraktikum/

Allgemeine Informationen / Tips, Tricks und Standardtechniken in C / Einzelne Bits setzen/löschen/abfragen...

aber.
So ganz kommen wir oder ich nicht auf die Lösung.

Das programm soll.

Die 8 bits des Wertes von t auf 1ser überprüfen.

Ich dachte das könnte ich machen indem ich eine FOR schleife 8 mal drüber laufen lassen könnte .
und dann jedes bit des Wertes von t mit (und) eins verknüpfen.

Rechnerisch soll das so aussehen


t = 10 = 00001010;

schleife (1) erster durchlauf

00001010 = t
00000001 = n = 1
-------------- = &
00000000 = ==0 / false

schleife (2) zweiter ...

00001010 = t
00000010 = n = 2
------------- = &
00000010 = !=0 / true ++zaehler

schleife (3) dritter ...

00001010 = t
00000100 = n = 3
------------- = &
00000000 = ==0 / false

etc.... bis 8




@wraith Ich habe dein quellcode eingebaut aber es bringt nicht den gewünschten effekt.

Ich hoffe jetzt ist es noch ein bischen verständlicher.
Danke
:confused: