• 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

Object Storage Arubacloud
0 głosów
306 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 (154,860 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 (154,860 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 (194,920 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 (154,860 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 (154,860 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 (154,860 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,567 wizyt
0 głosów
1 odpowiedź 139 wizyt
pytanie zadane 5 lutego 2020 w Mikrokontrolery przez Mavimix Dyskutant (8,390 p.)

92,624 zapytań

141,482 odpowiedzi

319,824 komentarzy

62,006 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!

...