Odwoływanie się do danych bitów

Odwoływanie się do danych bitów
P1
  • Rejestracja:około 7 lat
  • Ostatnio:około 2 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:około 8 lat
  • Ostatnio:3 minuty
  • Postów:4889
1

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


P1
  • Rejestracja:około 7 lat
  • Ostatnio:około 2 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:ponad 19 lat
  • Ostatnio:2 miesiące
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:prawie 19 lat
  • Ostatnio:około godziny
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:około miesiąc
  • 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:około 7 lat
  • Ostatnio:około 2 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:prawie 19 lat
  • Ostatnio:około godziny
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:ponad 19 lat
  • Ostatnio:2 miesiące
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:około miesiąc
  • 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:około 7 lat
  • Ostatnio:około 2 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:ponad 19 lat
  • Ostatnio:2 miesiące
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:około 16 godzin
  • 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:około 7 lat
  • Ostatnio:około 2 miesiące
  • Postów:179
0

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

Życzę miłego dnia.

Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)