Odwoływanie się do danych bitów

0

Witam.

Piszę pewien program na podstawie dokumentacji.

W dokumentacji jest napisany taki wykaz:

<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.

#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ę.

1

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

0

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

#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:

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.

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

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

#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:

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.

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.

0

Witam.

Przed chwilą napisałem coś takiego.

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

I wynikiem działania jest:

01000000 = 64

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

<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ą.

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.

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.

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

0
<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.

0

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

0
pestka12 napisał(a):
<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.

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
0

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

Życzę miłego dnia.

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