blog.garaż.net

27 październik 2006

dec2bin2hex

Kilka miłych sposobów na ułatwienie sobie życia - zwłaszcza jeśli masz problemy z kodem binarnym, szesnastkowym i zamianiem tego w tą i z powrotem na system dziesiętny.

Pierwszy program wyświetla liczbę w postaci binarnej, podlicza ilość bitów potrzebnych do jej reprezentacji, pełną postać liczby w pamięci w postaci binarnej (zależne od maszyny oraz kompilatora), liczbę z odwróconymi bitami (nie negacja tylko symetria ;) ) oraz liczbę w postaci szesnastkowej. Jeśli podamy liczbę ujemną dostaniemy dodatkowe informacje o bicie znaku oraz liczbę binarną w dwóch systemach: znak-moduł oraz znak-uzupełnienie do 1 dla minimalnej postaci, tzn. wyświetlona minimalna ilość bitów potrzebna do reprezentacji (postać znak-uzupełnienie do 2 zależy od długości liczby! dla tego nie ma jej w programie - oszczędzam dodatkowych wczytywań z klawiatury użytkownikowi ;) ) oraz forma pełna zależna od systemu (prawdopodobnie będzie to postać znak-uzupełnienie do 2 ale zależy to od Twojego sprzętu :P ) no i oczywiście liczba w systemie szesnastkowym.

Kod:

#include <stdio.h>
int main(void) {
    int i=0,j,out=0,tmp,znak;
    printf("Program do zamiany liczby binarnej na decymalna\nPodaj ciagiem kolejne bity i na koniec enter\n\nPamietaj o dwoch rzeczach:\n  * maksymalna dlugosc liczby to %d bity\n  * najstarszy bit (czyli pierwszy jesli\n    wprowadzisz wszystkie %d bity) to bit znaku\n\n",sizeof(int)*8,sizeof(int)*8);
    do {
        znak=getc(stdin);
        switch(znak) {
            case '1': out+=(1<<i); break;
            case '0': break;
            default: if(znak!=10) { printf("\nniewlasciwy znak, tylko 0 lub 1\n"); i--; }
        }
        i++;
    }while((znak!=10) && (i < (sizeof(int)*8) ));
    for(j=i-2,tmp=0;i>=0;i--) {
        tmp+=((out>>i)&1)<<j-i;
    }
    printf("\n\nWynik to %d decymalnie oraz 0x",tmp);
    for(i=sizeof(int)*2-1;i>=0;i--) {
        out=(tmp >> (i*4))&15;
        if(out>9) printf("%c",'A'+out-10);
        else printf("%d",out);
    }
    printf(" w postaci szesnastkowej.\n");
    return 0;
}

Drugi program zamienia podaną liczbę binarną na postać decymalną oraz szesnastkową. Do podania liczby ujemnej trzeba wprowadzić ilość bitów zależną od maszyny oraz kompilatora na jakim został skompilowany program. Pamiętaj też, że liczba ujemna musi zostać wprowadzona w postaci znak-dopełnienie do 2, może kiedyś mi się zachce zapisanie tego tak aby wymagało naturalniejszego dla człowieka zapisu znak-moduł.

Kod:

#include <stdio.h>
int main(void) {
    int a,at,bt;
    int i,j;
    printf("Podaj liczbe do obrobki: ");
    scanf("%d",&a;);
    if(a<0) at=a*(-1);
    else at=a;
    for(i=0;at>0;i++) at>>=1;
    printf("Ilosc bitow potrzebnych do zapisu liczby %d to %d",a,i);
    if(a<0) printf(" + bit znaku = %d bity.\nLiczba ujemna w postaci znak-modul:\n1 ",i+1);
    else printf("\n");
    if(a<0) at=a*(-1);
    else at=a;
    for(j=i-1;j>=0;j--) {
        printf("%d",(at>>j)&1);
    }
    if(a<0) {
        printf("\n\nLiczba ujemna w postaci znak-uzupelnienie do 1:\n1 ");
        for(j=i-1;j>=0;j--) {
            printf("%d",!((at>>j)&1));
        }
    }
    printf("\n\ndec2bin\n");
    for(i=sizeof(int)*8-1;i>=0;i--) {
        printf("%d",(a>>i)&1);
    }
    printf("b\n\nBitSwap\n");
    at=0;
    for(j=i=sizeof(int)*8-1;i>=0;i--) {
        at+=((a>>i)&1) << (j-i);
    }
    for(i=sizeof(int)*8-1;i>=0;i--) {
        printf("%d",(at>>i)&1);
    }
    printf("b\n\ndec2hex\n0x");
    for(i=sizeof(int)*2-1;i>=0;i--) {
        at=(a >> (i*4))&15;
        if(at>9) printf("%c",'A'+at-10);
        else printf("%d",at);
    }
    printf("\n");
    return 0;
}

Miłego używania oraz analizy. ;)

Comments !