Sposób na zapisanie liczby binarnie jako string

0

Mam pytanie odnośnie zadania. Funkcja jest częścią programu, który zwraca ilość wystąpień wzorca bitowego w sekwencji bitowej. Mam jednak problem z częścią, w której liczba jest zamieniana na stringa będącego jego reprezentacją binarną bez poprzedzających zer. Szybkie przemyslenie i rzut oka w sieci i mam takie coś:

string dec2bin(int number)
{   
	int i = 31;
	bool ok = false;
	char temp[ 31 ];
	while( i-- )
	{
		if( number >> i & 1 & !ok ) 		//omijanie zer z przodu
			ok = true;

		if( ok )						//wyśwetlanie liczby w formie binarnej
			temp[ i ] = (( number >> i ) & 1 );
	}
	string bin = temp;
	return bin;
}

Niestety nic z tego nie wynika, zwyczajnie nie działa. Co mogę zrobić?

0
std::string dec2bin(int number)
{
    if(number == 0) return "0";    
    unsigned int mask = 1 << (std::numeric_limits<unsigned int>::digits - 1);
    std::string s;
  
    while (!(mask & number)) mask >>= 1;
    while (mask) s.push_back("01"[(mask & number) ? 1 : 0]), mask >>= 1;
    return s;
}
1

zawsze mnie bawi jak widzę dec2bin(int number).
Fakt kiedyś były maszyny używające systemu dziesiętnego, więc int faktycznie może mieć reprezentację dziesiętną, ale tylko jak ktoś używa starej nietypowej maszyny.

Co do samego tematu.

Fred_Flintstone napisał(a):

Mam pytanie odnośnie zadania. Funkcja jest częścią programu, który zwraca ilość wystąpień wzorca bitowego w sekwencji bitowej. Mam jednak problem z częścią, w której liczba jest zamieniana na stringa będącego jego reprezentacją binarną bez poprzedzających zer. Szybkie przemyslenie i rzut oka w sieci i mam takie coś:

A po co ci do tego konwersja do napisu?
Może lepiej opisz dokładnie na czym polega ilość wystąpień wzorca bitowego w sekwencji bitowej, a dostaniesz rozwiązanie bez kombinowania z napisami. Najlepiej cała treść zadania, albo link do zadania jeśli to SPOJ/Main/hackerrank lub inne onlinowe zadanie.

1

Nie potrzbujesz tutaj konwertować nic do stringów, tak jak @MarekR22 napisał. Ale jeśli bardzo byś chciał to tutaj masz coś co działa, ale czego na pewno nie przepuściłbym na code review w pracy.

std::string giveMeZeroAndOnes(int dec)
{
   const std::string str = std::bitset<std::numeric_limits< int >::digits>(dec).to_string();
   auto it = std::find_if(str.begin(), str.end(), [](char ch) { return ch != '0'; });
   std::string ret;
   std::copy(it, str.end(), std::back_inserter(ret));
   return ret;
}
1
#include <stdio.h>
#include <limits.h>

unsigned count_pattern(unsigned value, unsigned pattern) {
	unsigned orig_pattern = pattern;
	// Compute mask and bit_size
	unsigned mask = 0;
	unsigned bit_size = 0;
	do {
		mask = (mask << 1U) | 1U;
		++bit_size;
	} while(pattern >>= 1);
	// Count pattern
	unsigned counter = 0;
	bit_size = CHAR_BIT * sizeof(unsigned) - bit_size;
	while (bit_size--) {
		if ((value & mask) == orig_pattern) {
			++counter;
		}
		value >>= 1;
	}
	return counter;
}

int main(void) {
	unsigned val = 0xFACDF3;
	unsigned pattern = 0x05;
	printf("count = %u\n", count_pattern(val, pattern));
	return 0;
}
0

A po co ci do tego konwersja do napisu?
Może lepiej opisz dokładnie na czym polega ilość wystąpień wzorca bitowego w sekwencji bitowej, a dostaniesz rozwiązanie bez kombinowania z napisami. Najlepiej cała treść zadania, albo link do zadania jeśli to SPOJ/Main/hackerrank lub inne onlinowe zadanie.

Zadanie polega na tym: Użytkownik wprowadza dwie zmienne typu int. Program ma zamienić obie na liczby w reprezentacji binarnej, a następnie znaleźć i policzyć wystąpienia w drugiej wzorca będącego tą pierwszą liczbą zapisaną binarnie. Pomijamy początkowe zera. Czyli wpisuję na przykład 5 i 54445 a program wyświetla mi 5. Mój pomysł był taki żeby zamienić te liczby na stringi i w nich szukać. Wiem już jednak, że takie rozwiązanie nie jest optymalne i można to zrobić lepiej. Niestety nie wiem jak to ugryźć.

1 użytkowników online, w tym zalogowanych: 0, gości: 1