dualzahl shiften?



  • Hi Leute! Ich hab folgenden code:

    #include<iostream>
    using namespace std;
    
    int main()
    {
        unsigned char a0, a1, a2, b0, b1, b2;
        unsigned short int a, b;
        unsigned short int i, x, z7, z6, z5, z4, z3, z2, z1, z0, y7, y6, y5, y4, 
    
    a=235
    b=121
    
         x = (a & 00000001);
         z0 = x;
    
         x = (a & 00000010);
         z1 = x >> 1;
    
         x = a & 00000100;
         z2 = x >> 7;
    
         x = a & 00001000;
         z3 = x >> 11;
    
        cout << "Dualzahl= " << z3 << z2 << z1 << z0 << endl;
    
        system("pause");
        return 0;
    }
    

    wenn ich hier nun die 1. ziffer in die z0 schreib, dann passt die... die zweite maskier ich nun mit 00000010 und verodere mit a und shifte um eins nach rechts. da bringt er mir dann aber das falsche...

    Könnt ihr mir helfen was da faul ist?


  • Mod

    Du meinst wohl UND statt ODER.
    Außerdem sind in deinem Programm noch ein paar mehr Fehler, beispielsweise die 11.



  • Ich bin mir nicht sicher ob ich dein vorhaben richtig verstanden habe.
    Es sieht so aus als möchtest du einen Dezimalzahl a=235 als Dualzahl ausgeben oder?

    Die Masken die du verwendest sind in Oktaldarstellung(wegen der führenden 0) d.h.
    deine erste Bitmaske 00000001(Oktal) = 1(Dezimal) = 00000001(Dual) stimmt weil in allen Zahlensystem die Darstellung 1=1 ist, deine Zweite wird aber so aussehen: 00000010(Oktal) = 8(Dezimal) = 00001000(Dual) und damit ist das nicht die Maske die du haben willst. Die Masken die du haben willst entsprechen den Zweierpotenzen 1,2,4,8,...

    Deine Shifts sind auch zu viel. Mit x>>7 schiebst du 7 bits weiter, du willst an dieser Stelle aber nur 2 schieben...

    EDIT: Semicolons fehlen im Code auch noch.



  • Das Problem in c++ ist, dass die schreibweise 00001111 eine oktalzahl ist.
    für binärzahlen gibt es soweit ich weis keine schreibweise, aber was du
    sehr einfach machen kannst (wo du gerade beim shiften bist):

    00000001 entspricht 1
    00000010 entspricht (1<<1)
    00000100 entspricht (1<<2)
    00001000 entspricht (1<<3)

    usw... bis (1<<7)

    sieht dann ungefähr so aus:

    [code]#include<iostream>
    using namespace std;
    
    int main()
    {
    	unsigned char a0, a1, a2, b0, b1, b2;
    	unsigned short int a, b;
    	unsigned short int i, x, z7, z6, z5, z4, z3, z2, z1, z0, y7, y6, y5, y4;
    
    	a=235;
    	b=121;
    
    	x = (a & 1);      // a & 00000001 bzw. a & 0x01
    	z0 = x;
    
    	x = (a & (1<<1)); // a & 00000010 bzw. a & 0x02
    	z1 = x >> 1;
    
    	x = a & (1<<2);   // a & 00000100 bzw. a & 0x04
    	z2 = x >> 2;
    
    	x = a & (1<<3);   // a & 00001000 bzw. a & 0x08
    	z3 = x >> 3;   
    
    	cout << "Dualzahl= " << z3 << z2 << z1 << z0 << endl;
    
    	system("pause");
    	return 0;
    }
    

    Ansonsten kannst du dir mit hilfe eines Taschenrechners die Dualzahl in einen Hex wert umrechnen

    z.B. 00110101 -> 0x35
    sieht dann bei einem beispiel so aus: x = (a & 0x04);

    Bei deinen Beispielen ist das aber sowieso relativ angenehm zu rechnen, da du ja nur jeweils 1 bit rausfiltern willst über das logische und.


Anmelden zum Antworten