Hej :)
Mam do rozwiązania takie oto zadanie:
Napisz program, który pobiera od użytkownika liczbę 64-bitową a następnie wyświetla ją w postaci bitowej na ekranie.
Liczbę należy zaprezentować w postaci serii ośmiu pełnych oktetów bitowych. Najmłodszy bit ma znaleźć się najdalej po prawej stronie.
W przypadku wprowadzenia przez użytkownika nieprawidłowych znaków program powinien zostać przerwany z kodem błędu 1 i komunikatem Incorrect input.
Przykładowa interakcja z programem -- sukces:
Podaj liczbę 64 bitową: 1⏎
Wynik: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000001 ⏎
Uwaga
W programie nie można wykorzystywać unii bitowych.
Rozpisałem swój kod:
#include <stdio.h>
#include <stdlib.h>
#include <stdint-gcc.h>
int isset_bit(const uint64_t* pvalue, int b)
{
if( pvalue == NULL || b < 0 || b > 63 )
{
return - 1;
}
uint64_t a;
a = *pvalue >> b;
if( a & 1 ) // sprawdza, czy dany bit jest jedynką
{
return 1;
}
return 0; // w przeciwnym wypadku bi jest zerem
}
int main()
{
printf("Podaj liczbe: ");
uint64_t a;
if(scanf("%u",&a)!=1)
{
printf("Incorrect input");
return 1;
}
int i;
for(i = 63; i >=0;i--)
{
int wynik = isset_bit(&a,i);
printf("%d",wynik);
if( (i + 1) % 8 == 0 && i != 63 )
{
printf(" ");
}
}
return 0;
}
Nie do końca muszę się przyznać rozumiem to co się dzieje w samej funkcji iisset_b. W sensie, że wiem co się dzieje, ale nie do końca rozumiem ten warunek.
a & 1
We wcześniejszej linijce przesunąłem bity o daną liczbę miejsc w prawo. Potem za pomocą koniunkcji porównuje, czy zachodzi prawidłowość, że bit w pierwszej liczbie (i liczbie drugiej 1) są ustawione na 1. Jeżeli w końcowym wyniku otrzymam wynik różny od zera( znaczy to, że jest w danym miejscu bit 1). Czy dobrze rozumuję?
Najpoważniejszy problem mam jednak z wynikami w konsoli. Dla 1 np. wychodzi mi takie coś:
000000000 00000000 00000000 01110100 00000000 00000000 00000000 0000001
Dlaczego w tej linijce:
01110100
bity są ustawione jak są?