Skocz do zawartości


Zdjęcie

[Inne] System dwójkowy i szesnastkowy


  • Zaloguj się, aby dodać odpowiedź
24 odpowiedzi w tym temacie

#1 Zgredekkman

Zgredekkman

    Początkujący

  • 18 postów

Napisano 21 05 2010 - 15:19

Witam, podczas wczorajszej nauki języka C++ natknąłem się na właśnie te pojęcia.
Poczytałem trochę o nich i zrozumiałem co nieco, ale mam wiele pytań.
Czy mógłby ktoś mi podać swój nr GG i mi je wytłumaczyć i odpowiedzieć na moje pytania?
Byłbym bardzo wdzięczny B)
Pozdrawiam B)

  • 0

#2 fernandez

fernandez

    150% normy

  • 1866 postów

Napisano 21 05 2010 - 15:39

pytaj tutaj to moze odpowiedzi sie innym przydadza..

  • 0

#3 Zgredekkman

Zgredekkman

    Początkujący

  • 18 postów

Napisano 21 05 2010 - 16:35

Ale chodzi mi o wytłumaczenie mi paru rzeczy, ale napiszę te ważniejsze pytania:
-Jak to się w końcu przelicza system dwójkowy na dziesiątkowy
-Jak szybko rozpoznawać jaka liczba w systemie dziesiątkowym to np. 0xff
-Jak pisać liczby po przecinku w tych 2 systemach, np. 1249,537
  • 0

#4 #plus

#plus

    Uzależniony od forum

  • 1315 postów

Napisano 21 05 2010 - 20:51

http://www.forum.tweaks.pl/Konwersje-systemow-liczbowych-t29888/ - poczytaj.
  • 0

#5 Kazeeny

Kazeeny

    Stały użytkownik

  • 209 postów

Napisano 21 05 2010 - 20:56

1. Chodzi Ci ogólnie o zasadę przeliczania z dwójkowego?
System dziesiątkowy jest naturalny dla ludzi i mało kto zwraca uwagę, że np. liczba 123 to jest 100 + 20 + 3. (jak wiesz, używamy cyfr od 0 do 9 - czyli mamy 10 cyfr i stąd nazwa system dziesiątkowy). Ale zauważ, że możesz to odczytać też w taki sposób, że to jest suma jednej setki (100 = 10^2), dwóch dziesiątek (10 = 10^1, czyli 20 = 2 * 10^1) i trzech jedności ( 1 = 10^0, czyli 3 = 3 * 10^0)
W systemie dwójkowym używamy tylko dwóch cyfr - 0 i 1. Zasada tworzenia liczb jest podobna jak w dziesiątkowym, tylko zamiast potęg dziesiątki mamy potęgi dwójki. Weźmy na przykład liczbę 10110001
To jest suma takich liczb:
1 * 2^7 = 128
0 * 2^6 = 0
1 * 2^5 = 32
1 * 2^4 = 16
0 * 2^3 = 0
0 * 2^2 = 0
0 * 2^1 = 0
1 * 2^0 = 1
Po zsumowaniu wychodzi liczba 177
2. 0xff oznacza, że to jest liczba zapisana w systemie szesnastkowym (a dokładnie w programowaniu to 0x właśnie ma nasuwać taką myśl). Właściwie mamy zapisaną liczbę FF (F oznacza "cyfrę" 15, czyli 15 * 16^1 + 15 * 16^0, czyli 255).
3. To już jest bardziej skomplikowania sprawa, ponieważ nie każdą liczbę zmiennopozycyjną można "ładnie" zamienić na system dwójkowy - tam też mogą wyjść okresy. W tej chwili nie podam Ci, jak to dokładnie się robi, bo już trochę mi się ta wiedza ulotniła, ale pamiętam tylko tyle (i tego też nie jestem w 100% pewna), że cyfry po przecinku nie dzielimy przez dwa tylko mnożymy (chodzi mi o tzw. zapis resztowy). Ale wiem, że na którejś stronie w internecie całkiem ładnie to zostało wyjaśnione, polecam poszukać


//edit: Plus był nieco szybszy :lol:

Użytkownik Katarina edytował ten post 21 05 2010 - 20:58

  • 0

#6 Zgredekkman

Zgredekkman

    Początkujący

  • 18 postów

Napisano 22 05 2010 - 18:14

Ok, dzięki za pomoc.
Bardzo mi się przydała, lecz miałbym jeszcze 1 prośbę:lol:
Czy możecie mi w podobny, łatwy do zrozumienia sposób wytłumaczyć,
jak szybko zamienić liczbę z systemu dwójkowego i szesnastkowego na dziesiątkowy :D

Użytkownik Zgredekkman edytował ten post 22 05 2010 - 18:15

  • 0

#7 Kazeeny

Kazeeny

    Stały użytkownik

  • 209 postów

Napisano 22 05 2010 - 18:39

jak szybko zamienić liczbę z systemu dwójkowego i szesnastkowego na dziesiątkowy

Toż to jest wszystko napisane w moim poprzednim poście :lol: szybszego sposobu nie znam

@down: ja właśnie próbowałam ominąć pojęcia bitów...

Użytkownik Katarina edytował ten post 22 05 2010 - 21:06

  • 0

#8 brutus3

brutus3

    Profesjonalista

  • 2406 postów

Napisano 22 05 2010 - 20:34

Mała poprawka do objaśnień Kateriny
To jest suma takich liczb:
Bit7-1 * 2^7 = 128
Bit6-0 * 2^6 = 0
Bit5-* 2^5 = 32
Bit4-3-* 2^4 = 16
Bit3-0 * 2^3 = 0
Bit2-0 * 2^2 = 0
Bit2-0 * 2^1 = 0
Bit0-1 * 2^0 = 1
Mówi się osiem bitów a pisze się od 0 do 7 bo zero w logice komputerowej jest też liczbą czyli bitem liczonym tak samo jak pozostałe bity. I jak widać Nr. bitów są pokazane malejąco i od prawej do lewej czyli od 7 do 0.
Może przedstawię to bardziej zrozumiale :
Nr. bitu - 7 - wartość bitu -128 - szesnastkowo - F i tu uwaga jeśli dodamy 128+128= 256 ale dokładnie w wartości komputera ma to 255 szesnastkowo FF - binarna to - 1111 1111 już widać że liczbie F binarnie odpowiada układ cyfr 1111 inaczej mówi się sygnalizacja stanu wysokiego lub zapalenia się bitu-piksela na obrazie w grafice.
Idźmy dalej :
Nr bitu -6 - wartość bitu 64/ Nr. bitu - 5 - wartość bitu 32/ Nr. bitu -4 - wartość bitu 16/ Nr. bitu -3- wartość bitu 8/ Nr bitu -2- wartość bitu 4/ Nr. bitu -1- wartość bitu 2/ Nr. bitu -0- wartość bitu 0.
Jak widzisz każda z liczb-bitów jest pomnożona przez 2 lub może być podzielona, w zależności od tego co i jak chcesz programować.
Liczby i wartości w Dec przedstawiamy w formie takiej jakie są, ale liczby Hex czyli szesnastkowe przedstawiamy formie znaków alfanumerycznych czli opócz cyfr stosujemy sześć znaków alfabetycznych po kolei A/B/C/D/E/F. Jeśłi zapamiętamy wartości zaków inaczej kodów szesnastkowych łatwo potem zamienimy kod na inny bin czy dec.
Dec -0 to Hex 00 a bin-0000
Dec -1 to Hex 01 a bin-0001
Dec -2 to Hex 02 a bin 0010
Dec -3 to Hex 03 a bin 0011
Dec -4 to Hex 04 a bin 0100
Dec -5 to Hex 05 a bin 0101
Dec -6 to Hex 06 a bin 0110
Dec -7 to Hex 07 a bin 0111
Dec -8 to Hex 08 a bin 1000
Dec -9 to Hex 09 a bin 1001
Dec -10 to Hex 0A a bin 1010
Dec -11 to Hex 0B a bin 1011
Dec -12 to Hex 0C a bin 1100
Dec -13 to Hex 0D a bin 1101
Dec -14 to Hex 0E a bin 1110
Dec -15 to Hex 0F a bin 1111
Liczba dec 16 w hex 10 a w bin 1 0000 ma wartość w n2 w dec= 65536 a w Hex 10 000 a w bin = 1 0000 0000 0000 0000.
Pisanie i liczenie od prawej ma zastosowanie w procesorach, tam jest to wykorzystywane w działaniach arytmetycznych mnożenie lub dzielenie to przesuwanie bitów w lewo lub w prawo.
Cz. 2
Skąd się wzięły wartości poszczególnych bitów, a no stąd że 1 bajt = 8 bitów każdy bit ma swą przypisaną wartość :
  • 0

#9 Zgredekkman

Zgredekkman

    Początkujący

  • 18 postów

Napisano 23 05 2010 - 09:47

Ok, dobra.
Ale mam jeszcze 1 problem. Jak zasygnalizować kompilatorowi, że
użyłem systemu dwójkowego tak jak to się robi 0x dla 16-tkowego i 0 dla 8-kowego ?

Użytkownik Zgredekkman edytował ten post 23 05 2010 - 12:49

  • 0

#10 fernandez

fernandez

    150% normy

  • 1866 postów

Napisano 23 05 2010 - 12:57

kompilator uzywa swojego jednego systemu (tak bardoz upraszczajac)

kwestia tylko wyswietlania tych danych...

napisz co chcesz zrobic?
  • 0

#11 brutus3

brutus3

    Profesjonalista

  • 2406 postów

Napisano 23 05 2010 - 14:29

Po prostu w programie pisząc rozkazy np: LDA (Dec)xxxx /(Ósemkowo)$xxxx/(Hex)#xxxx /(bin)%xxxx i tu powinno pisać w instrukcji która opcja co oznacza dla interpretera, musi wiedzieć jak chcemy aby nasze dane były zakodowane z naszą koncepcją wykonanie danego rozkazu. Nie wiem jak w innych programach ale z reguły np: adresy podajemy w takiej formie : wpierw mniej znaczący bajt potem bardziej znaczący bajt przykład LDA $300 załaduj do akumulatora wartość zawartą w pamięci pod adres $300 (Znak $ daje asemblerowi info że liczba 300 ma być zapisana w kodzie Hex (szesnastkowym). //chyba # jest dla Hex
Oczywiście sam memonik rozkazu LDA zamieniane jest na liczbę Hex w tym przypadku adresowanie absolutne w dziesiętnym będzie 173 w Hex AD a liczba 300 przedstawiona mniej znaczący bajt 00 i bardziej znaczący bajt 30 tak będzie wyglądał końcowy efekt przedstawienia kodu AD 00 30 . LDA może mieć różny kod w zależności od trybu adresowania :
Pośredni,X - A1 / absolutny - AD / pośredni,Y - B1 / strony zerowej,X - B5 itp.
Na koniec pełny wzór na obliczanie wartości w kodzie Hex (szesnastkowym):
1*27+1*26+1*25+1*24+1*23+1*22+1*21+1*20=128+64+32+16+8+4+2+1
Resztę sam sobie poznaj, ale uwaga! przeglądałem w internecie między w Wikipedii jak mają się informacje do rzeczywistości i okazuje się że bez książki informacje te są ubogie bo albo ich brak albo nie pełne na dodatek nieraz z błędami. Dlatego proponuję zdobycie odpowiednich książek i na postawie zawartych tam informacji uczyć się programowania, zwłaszcza pisania programów w assemblerze, a zwłaszcza rozkazów memonik.

Użytkownik Katarina edytował ten post 23 05 2010 - 15:03
"usemkowo"

  • 0

#12 Kazeeny

Kazeeny

    Stały użytkownik

  • 209 postów

Napisano 23 05 2010 - 14:48

Brutus... Czemu piszesz o jakimś assemblerze, jak z pierwszego postu wynika, że kolega chce się uczyć C++? Poza tym, uczę się assemblera i mi nieźle namotałeś teraz w głowie swoją wypowiedzią :lol:
Popełniłeś błąd w tym wzorze, bo przyjąłeś wagę 2 a nie 16. I oczywiście, to nie jest wzór tylko przykład :D

Użytkownik Katarina edytował ten post 23 05 2010 - 14:49

  • 0

#13 brutus3

brutus3

    Profesjonalista

  • 2406 postów

Napisano 23 05 2010 - 18:00

Spoko przyznam się że z językiem C++ nie miałem do czynienia jedynie po bieżnie jak z innymi, ale wiem że istnieją w każdym innym języku niż assembler możliwości wpisania bezpośrednio, wstawek w kodzie źródłowym w assemblerze.
A to podyktowane jest rozsądkiem, bo wstawki w assemblerze przyśpieszają pracę/działanie całego programu napisanego przy pomocy innego języka niż assembler. Należy pamiętać że nie ma innego żadnego innego języka w którym pisząc programy były by one szybsze od Assemblera bo po zassemblowaniu programu jaki napisaliśmy powstaje plik binarny gotowy do bezpośredniego odczytu-zrozumienia przez maszynę liczącą jaką jest komputer, w innych językach jest dołączany interpretator który ma za zadanie interpretacji kodu Hex lub Dec na binarny a tylko taki język jest faktycznym językiem zrozumiałym bezpośrednio przez maszynę liczącą jaką jest komputer.
Zresztą w każdym języku stosowane są memoniki lub słowa które za mieniane są przez dekodery na pliki kodu szesnastkowego a dopiero potem iterpreter odczytuje dane kody i zamienia je na znaki (cyfry) lub jak kto woli na stany napięć wysoki do 4,5V lub wyższy do 11,5V czyli stan taki oznaczany jest jedynką (1) a stan niski do 1,5V oznaczany zerem (0) i należy o tym pamiętać nie zależnie w jakim programie piszemy nawet w takim języku jak BASIC i jego odmianach. Owszem są programy gdzie nie trzeba pamiętać gdzie adresujemy bo sam koder przy kodowaniu z kodu źródłowego przekłada na kod wynikowy np. Hex sam umieszcza wszystko w odpowiednich komórkach oraz adresach które i tak potem mogą ulegać przesunięciu w zależności od zajętości pamięci.
Uczenie się tylko jednego języka wysokiego poziomu, doprowadza do znajomości np. bramki TTL ale brak wtedy podstaw niskiego poziomu powoduje że programy takie nie będą tak dobre jak pisane przez kogoś kto zna obydwa języki assembler i na przykład ACTON, Pascal czy C++.
Dlatego nic mu nie mącę po prostu pytał o assembler to dałem jak najwięcej info a to czy mu się namiesza to wszystko zależy od niego samego.
//chyba # jest dla Hex - nie zawsze według Assemblera może to oznaczać adresowanie np. ORG $600 oznacza początek adresu pod jakim zostanie umieszczony dany plik/program po jego inicjacji czyli jego uruchomienia chodzi o adres w pamięci RAM, a nie miejsce na dysku. # hasz to owszem jest to znakiem wskazującym że dana liczba już jest liczbą Hex szesnastkową, $ jest to znak dla kodera że w momencie assemblacji kodu źródłowego należy dokonać konwersji wartości Dec na Hex czyli da to z 300 Dec na 3000 Hex zapisanych według zasady od mniejszego do największego czyli postać Hex widoczna na komputerze czy wydruku z drukarki będzie miała 00 30.
W assemblerze można pisać w liczbach Dec, Hex i bin dlatego Dec ma $/ Hex ma #/ bin ma % oczywiście odmian assemblerów jest parę różnice są nie wielkie głównie chodziło o ilość rozkazów w zależności od mikroprocesora, ale ja podaję za MAC/65 pod mikro procesor 6502/6510/65C02 oraz 8080 i Z80.
  • 0

#14 Zgredekkman

Zgredekkman

    Początkujący

  • 18 postów

Napisano 23 05 2010 - 21:34

Przedstawie przykładem o co mi chodzi
Przykład ustawiania zmiennej i:
i=011[8] i=9[10]
i=0x11[16] i=17[10]
i=?[2]

Chodzi mi o tą sygnalizację
Jeżeli piszę kompilatorowi na początku wartości
0 - oznacza to, że liczba jest w zapisie ósemkowym
0x - oznacza, że jest w zapisie szesnastkowym
? - no właśnie, jak poinformować kompilator, że liczba np 10001[2] równa się 17[10], a nie 10001[10]

I jeszcze 1:
Co daje właściwie, że liczbę zapiszę w systemie ósemkowym, a nie dwójkowym ?
  • 0

#15 brutus3

brutus3

    Profesjonalista

  • 2406 postów

Napisano 23 05 2010 - 23:06

Musisz przedstawić pełną liczbę bin albo 0000 z 4 miejscami albo 8 miejsc 0000 0000 bo 10001 to może oznaczać 9 ale nie mam pewności i tu właśnie kłania się znajomość kodu binarnego po drugie zobacz jaki znak wskazuje że to jest kod bin. Jednym słowem zdaje mi się że korzystasz bez instrukcji objaśniającej. Sugeruję zdobyć instrukcję wraz z przykładami.
Ja stopuję i życzę powodzenia.
  • 0

#16 Kazeeny

Kazeeny

    Stały użytkownik

  • 209 postów

Napisano 23 05 2010 - 23:38

? - no właśnie, jak poinformować kompilator, że liczba np 10001[2] równa się 17[10], a nie 10001[10]

C++ nie wspiera takiego czegoś. Musisz sobie sam napisać funkcję, która przekształca ciąg na postać dziesiętną lub inną

Co daje właściwie, że liczbę zapiszę w systemie ósemkowym, a nie dwójkowym ?

Na pewno postać tej liczby jest "krótsza" :lol: np. gdy zapisujesz liczbę 16, to w systemie ósemkowym ma postać 208, a w dwójkowym 100002

Użytkownik Katarina edytował ten post 23 05 2010 - 23:43

  • 0

#17 Zgredekkman

Zgredekkman

    Początkujący

  • 18 postów

Napisano 27 05 2010 - 21:04

A co da, że zapiszę w systemie dwójkowym, a nie dziesiątkowym ?
  • 0

#18 izaw

izaw

    Początkujący

  • 97 postów

Napisano 27 05 2010 - 21:32

A co da, że zapiszę w systemie dwójkowym, a nie dziesiątkowym ?

Odpowiedź na to pytanie należy do ciebie. Komputer zawsze przechowuje liczby w zapisie binarnym, chyba że opracujesz własny i kolejne komórki pamięci będziesz wpisywał samodzielnie wyliczone wartości.

Zapis binarny, ósemkowy, dziesiętny, szesnastkowy istnieje tylko na styku komputer człowiek w celu łatwiejszej interpretacji przez niego. Tłumaczenie na dany system odbywa się "w locie" podczas operacji strumieniowych wejścia-wyjścia.
  • 0

#19 Calipers

Calipers

    Nowy

  • 3 postów

Napisano 20 06 2010 - 01:11

Zapis binarny, ósemkowy, dziesiętny, szesnastkowy istnieje tylko na styku komputer człowiek w celu łatwiejszej interpretacji przez niego

Nie prawda np. rejestry w procesorze są adresowane w hexach, adresacja pamięci też są w hexach, obsługa układów we/wy też jest w hexach. Polecam literaturę na temat Architektury komputerów oraz Układów i Systemów Mikroprocesorowych.

Użytkownik Calipers edytował ten post 20 06 2010 - 01:11

  • 0

#20 fernandez

fernandez

    150% normy

  • 1866 postów

Napisano 20 06 2010 - 12:29

no dobra to ja jestem ciekaw na jakiej podstawie taki procesor wie co to jest np 0xffffff

  • 0

Zobacz więcej tematów z tagiem: język C++



Użytkownicy przeglądający ten temat: 0

0 użytkowników, 0 gości, 0 anonimowych