Bity w pliku i system binarny

0

Cześć. Mam takie pytanie. Otóż sytuacja wygląda tak, że jest plik. Dajmy na to ma jeden bajt.

I teraz muszę odczytać pierwsze 3 bity. Ale mam pewność, że będzie to albo 0, albo 1. Więc, czy zamiast odczytywać te bity, mogę zamienić bajt na liczbę binarną i będę miał to samo?

Np bajt wygląda tak: 1000 0000
Jeśli go odczytam i zamienię na liczbę binarną, to będzie to tak samo wyglądało?

0

I teraz muszę odczytać pierwsze 3 bity. Ale mam pewność, że będzie to albo 0, albo 1.

No z zasady bity mają wartość 0 albo 1 :/

Więc, czy zamiast odczytywać te bity, mogę zamienić bajt na liczbę binarną i będę miał to samo?

Nie za bardzo rozumiem, ale chcesz odczytać z bajtu pierwsze trzy bity. To poczytaj o zamianach formatu liczb.

Ogólnie schemat jest: bajt=a128+b64+c32+d16+e8+f4+g*2+h
gdzie litery a..h - bity.

Żeby odczytać bity z bajtu trzeba go zamienić na liczbę binarną więc nie rozumiem: czy zamiast odczytać bity mogę odczytać bity ??

0

Np bajt wygląda tak: 1000 0000
Jeśli go odczytam i zamienię na liczbę binarną, to będzie to tak samo wyglądało?

to zależy... załóżmy sytuacje, że ów bajt jest zapisem liczby. I teraz wiemy, że nasza matryca ma 8 pozycji (1 bajt), ale duże liczby sie moga nam na niej nie zmieścic (to samo ulamki), przez co zapisane bedzie tylko 8 znaczących cyfr.... jeśli odczytasz cały bajt i potem zamienisz na liczbe binarną, t o w takim przypadku może ci się coś obsunąć i wyjść coś zupełnie innego. To samo się tyczy problemu przedstawiania liczb ujemnych (kod uzupełnieniowy) - trzeba by bardzo uważać... łatwiej chyba wczytać te 3 bity, niż wykonywać tyle operacji i sprawdzeń dla każdej możliwosci, chyba, ze założenia wiemy, jakie to są liczby, i nie spełniają one przedstawionych wyżej warunków....

0

Zaraz normalnie padnę! spin - po Tobie bym się nie spodziewał takich herezji... ech...

Bajt to bajt - 8 bitów. I totalnie bez znaczenia jest co on reprezentuje - znak, część liczby rzeczywistej czy kawałek wskaźnika na obiekt - to nie jest istotne bo to zawsze będzie ten sam bajt.

Więc odczytaj go do jakiejś zmiennej typu bajt i wytnij z niego pierwsze 3 bity. Tylko nie wiem, co uznajesz za 'pierwsze' - jeśli te bliżej lewej strony to będą to najstarsze:
twoj_bajt and $E0;
i ewentualnie można je jeszcze dosunąć do prawej:
(twoj_bajt and $E0) shr 5;

a jeśli chodzi o 3 najmłodsze, to:
twoj_bajt and 7;

0

Zaraz normalnie padnę! spin - po Tobie bym się nie spodziewał takich herezji... ech...

[wstyd] , przypomniała mi sie moja MaDonna od infy z liceum i jejherezje i "algorytmy" na zmiane systemu liczby... Pamiętam, jak kiedyś sprawdzała nam z tego sprawdzian... ja robiłem po swojemu, wszystcy pozostali (ci co ode mnie nie spisali) wg. jej algorytmu (3 razy dłuższego). I ona potem zamiast sprawdzić moj tok myślenia (zamiany) sprawdziła tylko wynik i dostalem 0/5.... potem ide sie targować, bo sprawdziłem w supernarzędziu "calc.exe" :P że mój wynik jest dobry.... i całą lekcje jej musiałem udowadniać, że to ona źle coś dodała/podzieliła czy pomyliło jej sie mod z div.... już nie pamiętam dokłądnie... i ona własnie tam coś cudowała z bitami znaku..... WSTYD MI, że sugerowałem sie jej "wymysłami"

MEA CULPA, MEA CULPA, MEA MAXIMA CULPA

[wstyd] [wstyd] [wstyd] [wstyd] [wstyd] [wstyd] [wstyd]

0

Więc odczytaj go do jakiejś zmiennej typu bajt i wytnij z niego pierwsze 3 bity. Tylko nie wiem, co uznajesz za 'pierwsze' - jeśli te bliżej lewej strony to będą to najstarsze:

Tak, chodzi mi o najstarsze

twoj_bajt and $E0;
i ewentualnie można je jeszcze dosunąć do prawej:
(twoj_bajt and $E0) shr 5;

Czy mógłbyś wyjaśnić ten kod po krótce? Tzn. co zrobi instrukcja

twoj_bajt and $E0;

, bo domyślam się, że instrukcja

(twoj_bajt and $E0) shr 5;

zrobi z bajtu: 1110 0000 bajt: 0000 0111, tak?

Ale chciałbym, żebyś wyjaśnił po co ta liczba hex. Jakie jest jej zadanie?

0

A wiesz na czym polega instrukcja and ? Jest to operator obliczający koniunkcję logiczną na bitach. Wyniki takiego and na bitach mogą być następujące:
1 and 1 = 1
1 and 0 = 0
0 and 1 = 0
0 and 0 = 0

Po lewej i prawej stronie operatora umieszczamy liczby typu byte i on nam oblicza wartość koniunkcji na poszczególnych bitach tych liczb.

Przykład
210 = 11010010
$E0 = 11100000

  11010010

and 11100000

  11000000

Czyli inaczej mówiąc jeśli na pierwszych trzech bitach pierwszej liczby były 1 to w wyniku też są jedynki, jeśli 0 to 0.
:)
Pozdrawiam

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