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

Funkcja wypisujaca liczbe w postaci dwojkowej na 16 bitach

0 głosów
622 wizyt
pytanie zadane 7 maja 2019 w C i C++ przez DobryKurczak Bywalec (2,320 p.)

Witam.

Mam do zrobienia funkcję typu void ktora ma za zadanie zamienić liczbe na postać dwójkówą. To jest "szkielet" funkcji i nie wiem co dalej:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

void WypiszBitowo(unsigned short liczba) {
	unsigned short maska;

}

Z tego co wiem, to można to zrobić przy pomocy maski, ale nie za bardzo rozumiem. Czy mógłby ktoś te funkcję napisać. Z góry dziękuję za każdą pomoc!

2 odpowiedzi

0 głosów
odpowiedź 7 maja 2019 przez tangarr Mędrzec (155,180 p.)
1. Musisz ustawić maskę tak aby tylko najstarszy bit był ustawiony na  1 reszta na 0.
2. Następnie porównujesz binarnie (AND) maskę z liczbą i wyświetlasz 0 lub 1
3. Przesuwasz maskę o jeden bit w prawo i wracasz do punktu 2
komentarz 7 maja 2019 przez DobryKurczak Bywalec (2,320 p.)
A jaką postać ma mieć maska? Jaką ma mieć wartość?
komentarz 7 maja 2019 przez tangarr Mędrzec (155,180 p.)
Masz 16 bitów, więc najstarszy bit (ten z lewej strony) musi mieć wartość 1 a kolejne piętnaście bitów musi mieć wartość 0.
Rozpisz to sobie na kartce.
komentarz 7 maja 2019 przez DobryKurczak Bywalec (2,320 p.)

Coś takiego zrobiłem

void WypiszBitowo(unsigned short liczba) {
	for (int i = 15; i >= 0; i--) 
		'0' + ((liczba >> i) & 1);
	printf("%hu", liczba);
}


Tylko wypisuje nadal w dziesiętnym. Co tu mam zmienić?

komentarz 7 maja 2019 przez j23 Mędrzec (195,240 p.)
A w jakim ma wypisywać, skoro ta pętla w zasadzie nic nie robi (jeśli chodzi o efekt)?
komentarz 7 maja 2019 przez tangarr Mędrzec (155,180 p.)

maska musi mieć wartość binarną 1000 0000 0000 0000
następnie porównujesz maskę ze swoją liczbą
 

  abcd efgh ijkl mnop
& 1000 0000 0000 0000
  -------------------
  a000 0000 0000 0000

jeżeli wynik jest równy 0 to bit a miał wartość 0 w przeciwnym wypadku 1

następnie przesuwasz maskę o jeden w prawo (0100 0000 0000 0000)

  abcd efgh ijkl mnop
& 0100 0000 0000 0000 
  ------------------- 
  0b00 0000 0000 0000

i tak dalej dla wszystkich bitów

komentarz 7 maja 2019 przez tangarr Mędrzec (155,180 p.)

Jeszcze taki mały szablon dla lepszego zrozumienia
 

void WypiszBitowo(unsigned short liczba) {
    unsigned short maska = ...
    while (maska != 0) {
        unsigned short koniunkcja = (koniunkcja bitowa liczby i maski)
        if (koniunkcja == 0)
            printf('0');
        else
            printf('1');
        maska = (przesuniecie bitowe maski o jeden w prawo)
    }
    printf('\n');
}

 

komentarz 7 maja 2019 przez DobryKurczak Bywalec (2,320 p.)

Coś takiego?

void WypiszBitowo(unsigned short liczba) {
	unsigned short maska = 0000000000000000;
		while (maska != 0) {
			unsigned short koniunkcja = liczba & maska;
				if (koniunkcja == 0)
					printf('0');
				else
					printf('1');
				maska = maska >> 1;
		}
	printf('\n');
}

 

komentarz 7 maja 2019 przez tangarr Mędrzec (155,180 p.)
Nie. Masz złą maskę. Podałem ci prawidłową maskę w formacie binarnym.
Teraz musisz ją poprawnie przypisać do zmiennej (najczytelniej by było w formacie szesnastkowym).
https://eduinf.waw.pl/inf/alg/006_bin/0014.php
komentarz 7 maja 2019 przez DobryKurczak Bywalec (2,320 p.)
edycja 7 maja 2019 przez DobryKurczak

No dobra, teraz zmieniłem maskę na:

	unsigned short maska = 0x8000;

Funkcja maina wygląda następująco:

void main()
{
	unsigned short liczba;
	printf("Podaj dowolna liczbe: ");
	scanf("%hu", &liczba);

	WypiszBitowo(liczba);

}

I nadal nie działa.

0 głosów
odpowiedź 7 maja 2019 przez mrspock Nowicjusz (240 p.)
Podstawowa sprawa to to, czy kazali ci tak zrobić przez przesuwanie bitów liczby. Bo to jest mało czytelne i takie kodowanie się stosuje tylko wtedy gdy trzeba optymalizować. Normalnie wystarczy dzielić z resztą przez 2 i brać resztę z dzielenia przez dwa i kolejne cyfry wychodzą.
komentarz 7 maja 2019 przez DobryKurczak Bywalec (2,320 p.)
To jest akurat dowolne. Byle żeby działało zgodnie z instrukcją

Podobne pytania

0 głosów
1 odpowiedź 1,943 wizyt
0 głosów
1 odpowiedź 217 wizyt
pytanie zadane 5 lutego 2020 w Mikrokontrolery przez Mavimix Dyskutant (8,420 p.)

93,424 zapytań

142,421 odpowiedzi

322,646 komentarzy

62,785 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
...