Operacje bitowe

0

mam problem z zadaniem:

Pobierz z klawiatury dwie liczby całkowite dodatnie X i Y (short).
• Dokonaj następujących operacji bitowych: ◦ and(X, Y)
◦ or(X, Y)
◦ xor(X, Y)
◦ not(X)
◦ not(Y)
◦ nand(X,Y)
◦ nor(X,Y)
◦ xnor(X,Y)
◦ Przesunięcie bitowe w lewo o 4 zmiennej X ◦ Przesunięcie bitowe w prawo o 3 zmiennej Y
• Wydrukuj wyniki na ekranie w postaci liczb dziesiętnych (wraz z opisem jaka liczba jest wynikiem jakiej operacji).
• Wydrukuj także wyniki na ekranie w postaci liczb binarnych (wraz
z opisem jaka liczba jest wynikiem jakiej operacji). (wykorzystaj funkcję wbudowaną do konwersji liczb na tekst, zawierającej opcję zapisu
w różnym systemie liczbowym).

mój kod:


#include <stdio.h>

int main()
{
     short a,b;
    printf("podaj 2 liczby calkowite dodatnie:\n");
    scanf("%hu %hu", &a, &b);
    printf("operacja and(X,Y): %d\n", a&b);
    printf("operacja or(X,Y): %d\n", a|b);
    printf("operacja xor(X,Y): %d\n", a^b);
    printf("operacja not(X): %d\n", (~a));
    printf("operacja not(Y): %d\n", ~b);
    printf("operacja nand(X,Y): %d\n", ~(a&b));
    printf("operacja nor(X,Y): %d\n", ~(a|b));
    printf("operacja xnot(X,Y): %d\n", ~(a^b));
    printf("Przesunięcie bitowe w lewo o 4 zmiennej X: %d\n", (a<<4));
    printf("Przesunięcie bitowe w prawo o 3 zmiennej Y: %d\n", (b>>3));

    return 0;
}

mam 2 pytania:

  1. przy podaniu liczb np. 3 i 4 mam taka odpowiedz:
    operacja and(X,Y): 0
    operacja or(X,Y): 7
    operacja xor(X,Y): 7
    operacja not(X): -4
    operacja not(Y): -5
    operacja nand(X,Y): -1
    operacja nor(X,Y): -8
    operacja xnot(X,Y): -8
    Przesunięcie bitowe w lewo o 4 zmiennej X: 48
    Przesunięcie bitowe w prawo o 3 zmiennej Y: 0

czy te liczby ujemne są poprawne?

  1. zupełnie nie wiem co zrobić z tym drugim poleceniem, nie mam pojęcia o jaka funkcje wbudowana do konwersji chodzi. Jaka to funkcja lub gdzie znajdę informacje na jej temat?
1

Nie widzisz tu sprzeczności?
scanf("%hu %hu", &a, &b);
printf("operacja and(X,Y): %d\n", a&b);

Wydrukuj wyniki w postaci bitowej to zobaczysz, albo byle kurs - operacje bitowe.

2
  1. Tak, wyniki ujemne są poprawne. Rozpisz to sobie, jeśli nie widzisz od razu: ~(0b0000'0000'0000'0011 | 0b0000'0000'0000'0100)~0b0000'0000'0000'01110b1111'1111'1111'1000-8. Hasło na dziś: kod uzupełnień do dwóch
  2. W drugim zadaniu polecają Ci użyć funkcji itoa, żeby wydrukować liczby w postaci binarnej, żeby łatwo było zobaczyć to samo, co wyżej.
0

próbuję wydrukowac jedna liczbę w zapisie binarnym, tak napisałem:

char tab[32];
itoa(12, tab, 2);
printf("%d\n", itoa(a, tab,2));

dostaje:

error: implicit declaration of function 'itoa' is invalid in C99

co robię nie tak?

2

Nic. Wywalili itoa w C99 (w sumie nawet nie wiem czemu…). Najbliższy temu jest sprintf, jeśli Twoja biblioteka standardowa obsługuje flagę %b, ale to wciąż nie jest to, o co twórca zadania pyta — „wykorzystaj funkcję wbudowaną do konwersji liczb na tekst, zawierającej opcję zapisu w różnym systemie liczbowym”; no i nie ma sensu sprintfować tekst pod printfa, zamiast od razu printfować. Nie ma takiej funkcji w C99. Była wcześniej (itoa), pojawi się w ograniczonej postaci¹ znowu w C23 (i jest już dostępna, na przykład, w glibcu 2.25). A na razie… 🤷


¹ Tzn. tylko niektóre podstawy są dostępne — na tę chwilę dziesiętna, ósemkowa i szesnastkowa, nadchodzi dwójkowa w C23.

2
maksym572285 napisał(a):

co robię nie tak?

printf("%s\n",itoa(a,tab,2)); z tym że
https://pl.wikibooks.org/wiki/C/itoa

Poza tym sprawdź czy dołączyłeś stdlib.h
Jezail tak to tak jak mówi @Althorion, to stare dzieje i raczej itoa w twoim kompilatorze nie istnieje.
Można spróbować zejść na niższy standard, lub:

char *itoa(unsigned value,char *buff,int sys)
{
    static const char digits[]="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    char tmp,*beg=buff,*end;
    for(unsigned next=1;next;*(end++)=digits[value-sys*(next=value/sys)]) {}
    *(end--)=0;
    for(char tmp;beg<end;++beg,--end)
    {
        tmp=*beg;
        *beg=*end;
        *end=tmp;
    }
    return buff;
}

int main()
{
	char buff[33];
	printf("%s\n",itoa(0,buff,10));  //0
	printf("%s\n",itoa(62,buff,2));  //111110
	printf("%s\n",itoa(56,buff,16)); //38
	printf("%s\n",itoa(36,buff,36)); //10
    return 0;
}
0

Gdy w grę wchodzą operacje bitowe to wyświetlanie w formacie decymalnym jest trochę bezcelowe. Lepiej używać flagi %x (hex), albo %b gdy jest dostępna. Poniższy kod kompilowany gcc-12:

    uint16_t u1, u2; // dołącz stdint.h
    printf("podaj dwie liczby całkowite: ");
    scanf("%hu %hu", &u1, &u2);

    printf("u1 = %hu(dec)\n", u1);
    printf("u2 = %hu(dec)\n", u2);
    printf("   bits:\n");
    printf("     111111          \n");
    printf("     5432109876543210\n");
    printf("     ||||||||||||||||\n");
    printf("u1 = %016b\n", u1);
    printf("u2 = %016b\n", u2);
    printf("AND  ----------------\n");
    printf("     %016b\n", u1 & u2);

a to wynik działania

podaj dwie liczby całkowite: 255 1000
u1 = 255(dec)
u2 = 1000(dec)
   bits:
     111111
     5432109876543210
     ||||||||||||||||
u1 = 0000000011111111
u2 = 0000001111101000
AND  ----------------
     0000000011101000

1 użytkowników online, w tym zalogowanych: 0, gości: 1