U2 i reprezentacje bitowe

0

Witam, mam do napisania takie o to funkcje.
Mógłby ktoś wytłumaczyć co krok po kroku trzeba było by zrobić aby to sprawnie działało? Nie wiem za co się zabrać

Napisz funkcję, która jako parametr przyjmie liczbę całkowitą. Zadaniem funkcji ma być zwrócenie reprezentacji u2 (uzupełnienie do dwóch) tej liczby w 16. bitowej reprezentacji. Określ największy przedział do jakiego może należeć przekazany do funkcji parametr.

Wiem jedynie tyle że trzeba podać liczbe, ale nie wiem jak zwrócić w u2 chociaż wiele przeczytałem na ten temat

0

zwróć jako tablicę 16 booli, albo po prostu jako stringa

1

Hmm dopiero zaczynam czyli ma być funkcja main gdzie podaje liczbe oraz funkcja np typu void zwracajaca tą reprezentacje tak?

0

Nie, zrób sobie funkcję zwracającą string, tak jak napisał hauleth funkcja zwracająca void nie zwraca nic.

2
struct repr_t {
  int bits[16];
  size_t highest_bit;
}

struct repr_t deconstruct(int16_t num) {
  struct repr_t repr;
  
  repr.highest_bit = fls(num);

  for (size_t i = 0; i < repr.highest_bit; ++i) {
    repr.bits[i] = (num & (1 << i)) > 0;
  }

  return repo;
}

Przy czym jeśli się uprzeć, to num już jest w 16 bitowej reprezentacji U2 (na większości platform), więc jedyne co potrzebujesz to wydłubać najwyższy postawiony bit (wyżej użyta funkcja fls).

0

Mógłbyś mi może napisac komentarze co robi co? Chciałbym to zrozumieć a też twardy kod większej wiedzy mi nie da, z góry dzieki

0
  • man 3 fls, podpowiem tylko, że to nie jest potrzebne, bo ja źle zrozumiałem zadanie, równie dobrze możesz zamiast fls zawsze wstawiać 16 i wyjdzie na to samo
  • a operacje bitowe powinieneś znać, bo skoro masz takie zadanie to na zajęciach na 100% było, a nie są one tutaj specjalnie skomplikowane (mała podpowiedź x << 1 == 2 * x a x << 2 == 4 * x, teraz już nawet za łatwe to zrobiłem, ale masz)

Resztę zrozumiesz debuggerem. Przepraszam, ale nie odwalę zadania domowego za Ciebie, musisz chociaż trochę się przyłożyć. Masz już działający kod, masz całkiem sporo opisu, teraz tylko musisz ogarnąć po kolei co robią podane instrukcje

0

To nie zadanie domowe, tylko dodatkowe dla chętnych, są to zadania z którymi nie miałem styczności i większość z nich aby zrozumieć najpierw czytałem następnie robiłem ale w tym wypadku nie moge zrozumieć tego u2, chodzi mi o to, że np jak wpisze 10 to co ma mi zwrócić?

0

Można to trochę uprościć:


vector<bool> decodeToU2( int number )
{
  if( number < numeric_limits<int16_t>::min() || number > numeric_limits<int16_t>::max() ) return vector<bool>{};

  int16_t number16 = number;

  vector<bool> result(16,0);

  for( size_t i=0 ; i<result.size() ; ++i )
  {
      result[result.size()-i-1] = number16 & (1 << i);
  }

  return result;
}

Funkcja decodeToU2 przyjmuje dowolną liczbę całkowitą int i zwraca ciąg 16 bitów będący jej bitową reprezentacją lub też ciąg pusty gdy liczba jest z poza zakresu int16_t.

0

@qwerty212: jeśli interesuje Cię to w celach praktycznych, to jest zdecydowanie łatwiejsze podejście:

auto set = stl::bitset<16>(static_cast<unsigned long>(number));

I masz gotowe. Jeśli jednak chcesz się nauczyć czegoś ciekawego to polecam samemu spróbować dojść jak to działa.

Tutaj masz sesję LLDB (w GDB powinno to działać podobnie) uruchamianą z terminala z ww. programem (poprawionym trochę), który wypisuje reprezentację bitową dla argumentu (run <arg> w debuggerze) gdzie widać jak po kolei są zmieniane rzeczy. Jeśli używasz jakiegoś IDE to masz pewnie zdecydowanie ładniejszy interfejs dostępny, więc możesz tam spróbować.

Polecenia, debuggera, które Cię interesują:

  • breakpoint (skrót b) do ustawienia punktu przerwania, tutaj widzisz jak przerywam na wejściu do funkcji
  • print (skrót p) do wyświetlenia wartości zmiennej (pozwala również na proste obliczenia, co widać jak używam p 1 << i w pętli)
  • step (skrót s lub enter po tym jak już raz tego użyłeś) przejście do następnej linijki kodu

Za każdym razem masz też widok podglądowy "gdzie się znajdujesz" w programie.

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