Anzeige:
Ergebnis 1 bis 4 von 4

Thema: bitverschiebung C

  1. #1
    korax
    Gast

    Question 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.

    Code:
    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
    Geändert von korax (25-10-2003 um 13:49 Uhr)

  2. #2
    Registrierter Benutzer
    Registriert seit
    24.06.2003
    Beiträge
    486
    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.
    Code:
    	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
    Code:
    size_t bitcount(unsigned int nr)
    {
    	size_t res = nr != 0;
    	while(nr &= (nr - 1))
    		res++;
    	return res;
    }

  3. #3
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    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.

    Code:
    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,
    _
    Qt/KDE Entwickler
    Debian Benutzer

  4. #4
    korax
    Gast
    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
    Code:
              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
    Geändert von korax (25-10-2003 um 13:47 Uhr)

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •