www.mikrocontroller.net

Forum: PC-Programmierung Bits in C multiplizieren


Autor: Bit (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo,
Ich lerne grad C.
Habe dass Kapitel mit den logischen Operatoren durch. Nun möcht ich die 
Aufgabe versuchen.

Multiplikation zweier Zahlen ohne "*".

Ich weiß aus der Digitaltechnikvorlesung noch, dass ich zwei Bits mit 
einem AND multiplizieren kann.

Zahl 1: 1001  (9)_10
Zahl 2: 1011  (11)_10

1001 * 1011 = ?

Also Bit 0: 1 & 1 = 1
     Bit 1: 0 & 1 = 0 Übertrag 1
     Bit 2: 0 & 1 = 0 + Übertrag = 1
     Bit 3: 1 & 1 = 1


     Bit 0: 1 & 0 = 0
     Bit 1: 0 & 0 = 0
     Bit 2: 0 & 0 = 0
     Bit 3: 1 & 0 = 0

 ...

Somit gilt

0001001
0010010
0000000
0100100
____

0111111


Ergebnis: 1001 .. stimmt nicht :(

Autor: Helmi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Ich weiß aus der Digitaltechnikvorlesung noch, dass ich zwei Bits mit
>einem AND multiplizieren kann.

Ja aber nur für eine Stelle.




Wie machst du es denn selber zu Fuss.


1001 * 1011   =  99
-----------
1001       (1001 * 1)
 0000      (1001 * 0)
  1001     (1001 * 1)
   1001    (1001 * 1)
=======
1100011       = 99

Du must die Stellen verschieben und dann addieren

Gruss Helmi

Autor: Bit (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Meine Idee:

Ich nehme Faktor 1

Ich nehme Faktor 2 ..

if (Faktor 2 & 1)    //Wenn Bit_0 = 1
{
  Faktor_1           //Ist Faktor_1 ein zwischenergebnis
}

Nun verschiebe ich den Faktor_2 ein Bit nach Links und wiederhole

if (Faktor 2 & 1)
{
  Faktor 1
}

Ich verschiebe wieder ...
if (...)
{

}

und nocheinmal ...

Nun kann ich meine Zwischenergebnisse einfach adieren´.

Ablauf korrekt? Also natürlich alles in ne Schleife packen

Autor: Helmi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja.

Schreib mal ein Programm und teste es.

Versuch mach kluch

GrussHelmi

Autor: Bit (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich gehe nun davon aus, dass meine Zahl 8 Bit lang ist (char)


  for (i = 1; i > 8;i++)
    {

        if (Faktor_2 & 1)
        {
           Produkt = Produkt + Faktor_1;
        }

        Faktor_2 <<= 1;
    }

Habe es kompelliert. Geht aber nicht :(

ne Idee was ich vergessen habe?

Autor: Helmi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>for (i = 1; i > 8;i++)

besser

for (i = 1; i < 8;i++)

Autor: Bit (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
klappt auch nicht. :(

Autor: Bit (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
#include <stdio.h>

int main (void)
{
    int Faktor_1, Faktor_2 ,i, Produkt;

    printf ("Geben Sie dem ersten Faktor ein : ");
    scanf  ("%d",&Faktor_1);
    fflush (stdin);
    printf ("Geben Sie den zweiten Faktor ein: ");
    scanf  ("%d",&Faktor_2);
    fflush (stdin);

    for (i = 1; i < 32;i++)
    {

        if (Faktor_2 & 1)
        {
           Produkt = Produkt + Faktor_1;
        }

        Faktor_2 <<= 1;
    }
    printf ("%d multipliziert mit %d ergibt: %d\n",Faktor_1, Faktor_2, 
Produkt);

    system ("Pause");
    return 0;
}

Autor: Helmi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
void main(void)
{

    int Faktor_1, Faktor_2 ,i, Produkt;

    printf ("Geben Sie dem ersten Faktor ein : ");
    scanf  ("%d",&Faktor_1);
    fflush (stdin);
    printf ("Geben Sie den zweiten Faktor ein: ");
    scanf  ("%d",&Faktor_2);
    fflush (stdin);

  Produkt = 0;
    for (i = 0; i < 32;i++)
    {

        if (Faktor_2 & 0x1)
        {
           Produkt = Produkt + Faktor_1;
        }

        Faktor_2 >>= 1;
    Faktor_1 <<= 1;
    }
    printf ("%d multipliziert mit %d ergibt: %d\n",Faktor_1, 
Faktor_2,Produkt);
}

Versuchs mal so

Autor: Bit (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
danke

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.