Sczytanie bitów z inta

2016-01-19 22:27

Rejestracja: 5 lat temu

Ostatnio: 3 lata temu

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";
    }
} 

Pozostało 580 znaków

2016-01-19 22:37

Rejestracja: 14 lat temu

Ostatnio: 12 godzin temu

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;
  }

Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.

Pozostało 580 znaków

2016-01-19 23:31

Rejestracja: 16 lat temu

Ostatnio: 1 rok temu

Lokalizacja: Katowice

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


"(...) otherwise, the behavior is undefined".
Dzięki wielkie ! Do tego projektu nie będzie mi to niezbędne ale na pewno warto o tym pamiętać ! - pargizon 2016-01-19 23:51

Pozostało 580 znaków

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