Sczytanie bitów z inta

0

Witam
Mam takie pytanie w jaki sposób mógłbym z inta sczytać poszczególne bity ? int posiada 32 bity więc tyle "0" i "1" można z niego sczytać.
Próbuje to zrobić w taki sposób ale niestety już przy 1 bicie zmienna znak przyjmuje bardzo dużą wartość a nie 0 ani 1.

void int_na_string(int x, string &tekst)
{
	int temp = 0;
	for (int i = 0; i < sizeof(int) * 8; ++i)
	{
		
		temp = x >> 1;
		tekst = tekst + getstring(temp);
		x = x >> 1;

	} 
string getstring(int temp)
{
	int znak = temp>>1;
	if (znak == 0)
	{
		return "0";
	}
	if (znak == 1)
	{	
		return "1";
	}
} 
4
string int2bin(int x)
  {
   string ret;
   for(unsigned i=0;i<8*sizeof(int);++i,x>>=1) ret+=(char)('0'+(x&1));
   return ret;
  }
7

int nie posiada 32 bitów. Rozmiar int jest definiowany przez implementację, ale powinien to być typ "naturalny" dla danej platformy sprzętowej. Jest też jedno wymaganie: int musi mieć minimum 16 bitów. Na dodatek nie wiadomo też ile bitów ma bajt, to również jest definiowane przez implementację, ale musi to być minimum 8.

Dlatego dobrze najpierw zrobić sobie coś, co uniwersalnie zwróci nam ile bitów ma dany typ. Np. taki szablon zmiennej:

template <typename T>
constexpr std::size_t bitsInType = sizeof(T) * CHAR_BIT;

sizeof zwraca rozmiar w bajtach, a CHAR_BIT mówi ile bitów jest w bajcie.

Teraz możemy zastanowić się nad kodem, który wyprodukuje tekstowy zapis jej binarnej reprezentacji. W C++ można wykorzystać do tego klasę std::bitset. Może przyjąć ona wartość liczbową bezpośrednio w konstruktorze i zwrócić std::string za pomocą metody to_string. Czyli w sumie to jedna linijka:

std::bitset<bitsInType<int>>(value).to_string();

Parametrem szablonu jest rozmiar bitsetu - w naszym wypadku tyle, ile jest bitów w int.

To wszystko można złożyć w prosty kod:

template <typename T>
constexpr std::size_t bitsInType = sizeof(T) * CHAR_BIT;
 
template <typename T>
std::string binaryReprestation(T value) {
  static_assert(std::is_integral<T>::value, "Value needs to be integral");	
 
  return std::bitset<bitsInType<T>>(value).to_string();	
}

Za pomocą static_assert upewniamy się, że typ użyty w funkcji (parametr szablonu) to jeden z wbudowanych typów całkowitoliczbowych - tylko takie można przekazać do konstruktora std::bitset.

Przykład: http://ideone.com/oRmtQ8

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