ale skąd mam wiedzieć ile bitów ma liczba […]
Wiesz czym jest sizeof
? No, to teraz wiesz ile bitów ma liczba. Jeśli problemem dla Ciebie jest pominięcie wiodących zer, to nic nie stoi na przeszkodzie, aby w pętli przesuwać liczbę w lewo dotąd, aż najstarszy bit będzie zapalony. Oczywiście pod warunkiem, że wejściowa liczba jest większa od 0
.
[…] oraz ile kiedy to zakończyć […]
Skoro wiesz ile bitów ma zmienna liczbowa, to możesz określić liczbę iteracji pętli.
Niżej podaję swoją propozycję, ale nie wiem czy nie przekombinowałem – rzadko piszę w C(++):
void toBin(unsigned int number)
{
if(number > 0)
{
unsigned int bits = sizeof(number) * 8;
unsigned int mask = 1 << (bits - 1);
unsigned int iter = bits;
while((number & mask) == 0)
{
number <<= 1;
--iter;
}
while(iter-- > 0)
{
std::cout << ((number & mask) >> (bits - 1));
number <<= 1;
}
}
else
std::cout << 0;
}
Kod działa prawidłowo. Choć użyłem w nim unsigned int
, bo mi się krzaczył z int
– wszystko przez ciągłe modyfikowanie najstarszego bitu, czyli bitu znaku. ;)
Edit: Dla typu int
też się da. Sama zmiana typu danych parametru i zmiennych lokalnych spowoduje, że 0
będą ładnie wyświetlane, ale zamiast 1
wyświetlać będzie -1
. Czyli dla liczby 44
jako int
, funkcja wypluje na konsoli -10-1-100
. Tak więc przy wyświetlaniu cyferki, wynikowi koniunkcji i przesunięcia należy zmienić znak:
std::cout << -((number & mask) >> (bits - 1));
Tutaj jest działający przykład dla typu int
.