Odwoływanie się do danych bitów

Odwoływanie się do danych bitów
P1
  • Rejestracja:ponad 7 lat
  • Ostatnio:3 miesiące
  • Postów:179
0

Witam.

Piszę pewien program na podstawie dokumentacji.

W dokumentacji jest napisany taki wykaz:

Kopiuj
<bit 7-6: bytedata count that follows (0-3)>
<bit 5-4: only used if pkglength < 63>
<bit 3-0: least significant package length nybble>

I teraz pytanie czy prawidłowo się odwołuje do zakresu np od 0-3.

Kopiuj
#include<iostream>
using namespace std;
int main()
{
uint8_t Pkg=64;
for(int i=0;i<3;i++)
{
 cout<<static_cast<int>((1<<i)&Pkg)<<endl; // <--- Teraz wyświetlam pierwsze 3 bity 
}

Chodzi mi żeby odnieść się do danego bitu a dokładniej go wyświetlić. (Wiem że jest klasa bitset)
Bardzo dziękuję za każdą pomoc oraz poradę.

lion137
  • Rejestracja:ponad 8 lat
  • Ostatnio:minuta
  • Postów:4941
1

Sprawdź, czy ci wyświetla właściwe bity.


P1
  • Rejestracja:ponad 7 lat
  • Ostatnio:3 miesiące
  • Postów:179
0

Napisałem taki szybki programik który ma wyświetlić poszczególne bity danej liczby.

Kopiuj
#include<iostream>
using namespace std;
int main()
{
 uint8_t Pkg=64;
 for(int i=0;i<8;i++)
 {
    cout<<i<<": "<<static_cast<int>((1<<i)&Pkg)<<endl;
 }
}

I wynik tego działania jest taki:

Kopiuj
0: 0
1: 0
2: 0
3: 0
4: 0
5: 0
6: 64
7: 0

Dlatego zadałem to pytanie na forum ponieważ wszystkie bity są na zero oprócz 6 i nie wiem czy źle się odowołuje.

_13th_Dragon
  • Rejestracja:prawie 20 lat
  • Ostatnio:14 dni
0
Kopiuj
#include <iostream>
using namespace std;

int main()
{
    uint8_t Pkg=64;
    for(int i=0;i<8;++i) cout<<i<<": "<<((Pkg>>1)&1)<<" => +"<<(1<<i)*((Pkg>>1)&1)<<endl;
    return 0;
}

Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
edytowany 3x, ostatnio: _13th_Dragon
AN
  • Rejestracja:około 19 lat
  • Ostatnio:około 7 godzin
0

Proponuję dodać pętlę po wszystkich możliwych wartościach:

Kopiuj
#include <iostream>
using namespace std;

int main()
{
    for (uint8_t Pkg=0; Pkg <= 255; Pkg++)
    {
        // Wypisanie liczby w postaci binarnej
        for(int i=0;i<8;++i) cout << ((PobierzBit(PkG, i) != 0) ? "1" : "0");

        // Odstep i wypisanie w postaci dziesietnej
        cout << "   " << Pkg << endl;

        // Wymuszenie wyjscia z petli, bo dodanie 1 do 255 spowoduje zmiane na 0, wiec warunek iteracji bedzie caly czas spelniony
        if (PkG == 255)
        {
            break;
        }
    }
    return 0;
}

W miejscu PobierzBit(PkG, i) wstawiasz wyrażenie, które wyciąga bit nr i z liczby PkG. Możesz wypisać inne znaki, np. # jako 1 i spację jako 0, wtedy wzór będzie wyraźniejszy.

Powinieneś dostać coś takiego:

Kopiuj
00000000   0
00000001   1
00000010   2
00000011   3
...
11111100   252
11111101   253
11111110   254
11111111   255

Jak uruchomisz program i przejrzysz wyjście oczami, to od razu będziesz widzieć, czy dobrze wyciągasz poszczególne bity z liczby, bo wartości binarne będa się układać w charakterystyczny regularny wzór.

edytowany 2x, ostatnio: andrzejlisek
DZ
  • Rejestracja:ponad 13 lat
  • Ostatnio:3 miesiące
  • Lokalizacja:Podaj nazwę miejscowości
1
pestka12 napisał(a):

uint8_t Pkg=64;
...
Dlatego zadałem to pytanie na forum ponieważ wszystkie bity są na zero oprócz 6 i nie wiem czy źle się odowołuje.

Wpisz sobie 64 (dziesiętnie) do jakiegoś kalkulatora i zobacz taka jest reprezentacja bitowa tej liczby.

q1.png

A to że na ekranie masz zera i "64" a nie "1" wynika z faktu że wyświetlasz wartość (dziesiętną) danego bitu z uwzględnieniem jego pozycji.

  • q1.png (10 KB) - ściągnięć: 5
P1
  • Rejestracja:ponad 7 lat
  • Ostatnio:3 miesiące
  • Postów:179
0

Witam.

Przed chwilą napisałem coś takiego.

Kopiuj
#include<iostream>
#include<bitset>
using namespace std;
int main()
{
    bitset<8> Pkg{64};
    cout<<Pkg.to_string()<<endl;
}

I wynikiem działania jest:

Kopiuj
01000000 = 64

Jak już mam rozłożone na poszczególne bity to teraz jak to zastosować do dokumentacji.

Kopiuj
<bit 7-6: bytedata count that follows (0-3)>
<bit 5-4: only used if pkglength < 63>
<bit 3-0: least significant package length nybble>

Np zakres 0-3 bitów , to mam je sumować czy jak żeby uzyskać liczbę decymalną.

AN
  • Rejestracja:około 19 lat
  • Ostatnio:około 7 godzin
0

Np zakres 0-3 bitów , to mam je sumować czy jak żeby uzyskać liczbę decymalną.

Bit0 + (Bit1 << 1) + (Bit2 << 2) + (Bit3 << 3) gdzie Bit0, Bit1, Bit2 i Bit3 to wartości poszczególnych bitów, może być 0 lub 1.

_13th_Dragon
  • Rejestracja:prawie 20 lat
  • Ostatnio:14 dni
0
pestka12 napisał(a):

Jak już mam rozłożone na poszczególne bity to teraz jak to zastosować do dokumentacji.

Nijak, najpierw musisz zrozumieć zasadę, dopóki nie załapałeś to nie ma możliwości napisania tego, oprócz otrzymania gotowca od dobrego wujka.

Kopiuj
#include <iostream>
#include <functional>
#include <vector>
#include <cmath>
using namespace std;

int main()
{
	union alternate
	{
	    unsigned value;
	    struct
	    {
	      unsigned length:4;
	      unsigned only:2;
	      unsigned count:2;
	    };
	};
	int count=2;
	int only=3;
	int length=10;
	alternate x;
	x.value=(count<<6)|(only<<4)|(length<<0);
	cout<<x.count<<" must be "<<count<<endl;
	cout<<x.only<<" must be "<<only<<endl;
	cout<<x.length<<" must be "<<length<<endl;
	return 0;
}

Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
edytowany 2x, ostatnio: _13th_Dragon
DZ
  • Rejestracja:ponad 13 lat
  • Ostatnio:3 miesiące
  • Lokalizacja:Podaj nazwę miejscowości
1
andrzejlisek napisał(a):

Np zakres 0-3 bitów , to mam je sumować czy jak żeby uzyskać liczbę decymalną.

Bit0 + (Bit1 << 1) + (Bit2 << 2) + (Bit3 << 3) gdzie Bit0, Bit1, Bit2 i Bit3 to wartości poszczególnych bitów, może być 0 lub 1.

Rozbijanie liczby na bity żeby ją potem posklejać to chyba już lekkie przegięcie.

wartosc_bitow_0_3 = Pkg & 0x0F;
wartosc_bitow_4_5 = (Pkg >> 4) & 0x03;
itp.

_13th_Dragon
hmm, o union słyszałeś? W sensie popieram, o ile te ilości bitów są zmienne, ale skoro są stale ...
enedil
To nie unia akurat
_13th_Dragon
Jak nie skoro właśnie tak, patrz post wyżej.
P1
  • Rejestracja:ponad 7 lat
  • Ostatnio:3 miesiące
  • Postów:179
0
Kopiuj
<bit 7-6: bytedata count that follows (0-3)>
<bit 5-4: only used if pkglength < 63>
<bit 3-0: least significant package length nybble>

A pod tym jest ostrzeżenie o takiej treści w dokumentacji:

Wysokie 2 bity pierwszego bajtu pokazują, ile kolejnych bajtów znajduje się w PkgLength. Jeśli PkgLength ma tylko jeden bajt, bity od 0 do 5 są używane do kodowania długości pakietu (innymi słowy, wartości 0-63). Jeśli wartość długości pakietu jest większa niż 63, do kodowania musi być użyty więcej niż jeden bajt, w którym to przypadku bity 4 i 5 PkgLeadByte są zarezerwowane i muszą wynosić zero. Jeśli używane jest kodowanie wielobajtowe, bity 0-3 PkgLeadByte stają się najmniej znaczącymi 4 bitami wynikowej wartości długości pakietu. Następny ByteData stanie się kolejnymi najmniej znaczącymi 8 bitami wynikowej wartości i tak dalej, aż do 3 bajtów ByteData. Zatem maksymalna długość paczki to 2*28.

_13th_Dragon
  • Rejestracja:prawie 20 lat
  • Ostatnio:14 dni
0

Wiec ostrzeżenie nie pasuje do opisu bitowego, jedyny sposób to zgłosić do autorów brak konsekwencji w opisie.


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
BG
  • Rejestracja:prawie 6 lat
  • Ostatnio:4 dni
  • Postów:289
0
pestka12 napisał(a):
Kopiuj
<bit 7-6: bytedata count that follows (0-3)>
<bit 5-4: only used if pkglength < 63>
<bit 3-0: least significant package length nybble>

A pod tym jest ostrzeżenie o takiej treści w dokumentacji:

Wysokie 2 bity pierwszego bajtu pokazują, ile kolejnych bajtów znajduje się w PkgLength. Jeśli PkgLength ma tylko jeden bajt, bity od 0 do 5 są używane do kodowania długości pakietu (innymi słowy, wartości 0-63). Jeśli wartość długości pakietu jest większa niż 63, do kodowania musi być użyty więcej niż jeden bajt, w którym to przypadku bity 4 i 5 PkgLeadByte są zarezerwowane i muszą wynosić zero. Jeśli używane jest kodowanie wielobajtowe, bity 0-3 PkgLeadByte stają się najmniej znaczącymi 4 bitami wynikowej wartości długości pakietu. Następny ByteData stanie się kolejnymi najmniej znaczącymi 8 bitami wynikowej wartości i tak dalej, aż do 3 bajtów ByteData. Zatem maksymalna długość paczki to 2*28.

Kopiuj
00nnnnnn - pakiet ma 0...63 bajtów
0100nnnn nnnnnnnn - pakiet ma 0...2^12-1 bajtów
1000nnnn nnnnnnnn nnnnnnnn - pakiet ma 0...2^20-1 bajtów
1100nnnn nnnnnnnn nnnnnnnn nnnnnnnn
P1
  • Rejestracja:ponad 7 lat
  • Ostatnio:3 miesiące
  • Postów:179
0

Dziękuję za każdą pomoc. Problem rozwiązany.

Życzę miłego dnia.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.