• 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)

Object Storage Arubacloud
0 głosów
481 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 (194,920 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 (194,920 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ź 458 wizyt
0 głosów
2 odpowiedzi 611 wizyt
pytanie zadane 14 lutego 2016 w C i C++ przez Ziuziek Mądrala (5,140 p.)
0 głosów
1 odpowiedź 401 wizyt

92,556 zapytań

141,404 odpowiedzi

319,560 komentarzy

61,942 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.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...