[Inne] System dwójkowy i szesnastkowy
#1
Napisano 21 05 2010 - 15:19
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
Pozdrawiam
#2
Napisano 21 05 2010 - 15:39
#3
Napisano 21 05 2010 - 16:35
-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
#4
Napisano 21 05 2010 - 20:51
#5
Napisano 21 05 2010 - 20:56
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
Użytkownik Katarina edytował ten post 21 05 2010 - 20:58
#6
Napisano 22 05 2010 - 18:14
Bardzo mi się przydała, lecz miałbym jeszcze 1 prośbę
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
Użytkownik Zgredekkman edytował ten post 22 05 2010 - 18:15
#7
Napisano 22 05 2010 - 18:39
Toż to jest wszystko napisane w moim poprzednim poście szybszego sposobu nie znamjak szybko zamienić liczbę z systemu dwójkowego i szesnastkowego na dziesiątkowy
@down: ja właśnie próbowałam ominąć pojęcia bitów...
Użytkownik Katarina edytował ten post 22 05 2010 - 21:06
#8
Napisano 22 05 2010 - 20:34
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ść :
#9
Napisano 23 05 2010 - 09:47
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
#10
Napisano 23 05 2010 - 12:57
kwestia tylko wyswietlania tych danych...
napisz co chcesz zrobic?
#11
Napisano 23 05 2010 - 14:29
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"
#12
Napisano 23 05 2010 - 14:48
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
Użytkownik Katarina edytował ten post 23 05 2010 - 14:49
#13
Napisano 23 05 2010 - 18:00
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.
#14
Napisano 23 05 2010 - 21:34
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 ?
#15
Napisano 23 05 2010 - 23:06
Ja stopuję i życzę powodzenia.
#16
Napisano 23 05 2010 - 23:38
C++ nie wspiera takiego czegoś. Musisz sobie sam napisać funkcję, która przekształca ciąg na postać dziesiętną lub inną? - no właśnie, jak poinformować kompilator, że liczba np 10001[2] równa się 17[10], a nie 10001[10]
Na pewno postać tej liczby jest "krótsza" np. gdy zapisujesz liczbę 16, to w systemie ósemkowym ma postać 208, a w dwójkowym 100002Co daje właściwie, że liczbę zapiszę w systemie ósemkowym, a nie dwójkowym ?
Użytkownik Katarina edytował ten post 23 05 2010 - 23:43
#17
Napisano 27 05 2010 - 21:04
#18
Napisano 27 05 2010 - 21:32
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.A co da, że zapiszę w systemie dwójkowym, a nie dziesiątkowym ?
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.
#19
Napisano 20 06 2010 - 01:11
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.Zapis binarny, ósemkowy, dziesiętny, szesnastkowy istnieje tylko na styku komputer człowiek w celu łatwiejszej interpretacji przez niego
Użytkownik Calipers edytował ten post 20 06 2010 - 01:11
#20
Napisano 20 06 2010 - 12:29
Użytkownicy przeglądający ten temat: 1
0 użytkowników, 1 gości, 0 anonimowych