Archiv verlassen und diese Seite im Standarddesign anzeigen : bitverschiebung C
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:
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,
_
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:
Powered by vBulletin® Version 4.2.5 Copyright ©2025 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.