• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Postać bitowa ( prośba o wyjaśnienie poszczególnych operacji bitowych)

42 Warsaw Coding Academy
0 głosów
682 wizyt
pytanie zadane 24 kwietnia 2020 w C i C++ przez Hubertius Bywalec (2,970 p.)

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ą?

komentarz 24 kwietnia 2020 przez j23 Mędrzec (195,240 p.)

Rozpisałem swój kod: [...]

Nie do końca muszę się przyznać rozumiem to co się dzieje w samej funkcji iisset_b.

Pismo automatyczne, czy jak? :D

komentarz 24 kwietnia 2020 przez Hubertius Bywalec (2,970 p.)
Hmm... bardziej chodziło mi o to, że nie wiedziałem jak rozpisać tą funkcję ( teraz sam widzę, że zbędną) i szukając na internecie dowiedziałem się, że właśnie w ten sposób mogę sprawdzić dany bit. Więc nie do końca byłem pewny po prostu tego co robię. W powyższym właśnie o to mi chodziło.

1 odpowiedź

+1 głos
odpowiedź 24 kwietnia 2020 przez j23 Mędrzec (195,240 p.)
wybrane 24 kwietnia 2020 przez Hubertius
 
Najlepsza

Czy dobrze rozumuję?

Dobrze.

Tę całą funkcję isset_bit można zredukować do wyrażenia (a >> b) & 1. Nie wiem, po co aż tak kombinujesz.

Dlaczego w tej linijce:

101110100bity

są ustawione jak są?

Dlatego, że funkcją scanf czytasz liczbę 32-bitową do zmiennej typu 64-bitowego. Daj taki format-string: %llu

Podobne pytania

0 głosów
1 odpowiedź 761 wizyt
0 głosów
2 odpowiedzi 998 wizyt
pytanie zadane 14 lutego 2016 w C i C++ przez Ziuziek Mądrala (5,140 p.)
0 głosów
1 odpowiedź 684 wizyt

93,383 zapytań

142,382 odpowiedzi

322,539 komentarzy

62,744 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

VMware Cloud PRO - przenieś swoją infrastrukturę IT do chmury
...