DOUG LLYOYD: Så heksadesimale tall, som om vi trengte en annen basetall ordningen ikke sant? Vel, de fleste vestlige kulturer, som du sikkert er kjent, bruke desimal system-- basen 10, for å representere numeriske data. Vi har sifrene 0, 1, 2, 3, 5, 6, 7,8,9. Og hvis vi trenger å representere verdier høyere enn ni, vi kan kombinere disse sifrene bruker begrepet sted verdi. Så for 10, har vi en 1 sifret etterfulgt av en 0 sifret og vi intuitivt forstår at det vi gjør det er vi multiplisere det første en med 10, og deretter legge til 0 for totalt 10. Datamaskiner gjøre noe ganske lignende, som du er sikkert kjent, med det binære system-- base 2. Forskjellen der er at det er bare to sifre å arbeide with-- 0 og 1. Og så våre sted verdier, stedet for å være en, ti, hundre, tusen, som de ville være i desimalsystemet, er ett, to, fire, åtte, og så videre. Her er tingen selv, disse 0 og 1-ere, spesielt hvis vi blir dataforskere og vi gjør mye programmering eller arbeider med datamaskiner, var å gå å se mye av binære tall. Og disse 0 og 1-ere i store kjedene kan være svært vanskelig å analysere. Vi kan ikke bare se på en rekke 0 og 1-ere og nødvendigvis vet nøyaktig hva det er. Men det er likevel nyttig å kunne ekspress data på samme måte at en datamaskin gjør. Vi har denne oppfatningen av heksadesimale systemet, som er basen 16, i stedet for basen 10 eller base 2. Noe som betyr at vi har 16 siffer å arbeide med i stedet for 10 eller to. Og det er en mye mer konsis måte å uttrykke binær informasjon om et datasystem, det er mye mer menneskelig forståelig. Så vi har sifrene 0 til 9, og deretter vi har også disse ekstra seks digits-- en, b, c, d, e og f, som representerer 10, våre forestillinger om 10, 11, 12, 13, 14 og 15, i desimal. Noen ganger, forresten, vil du også se disse a til f-tallet som hovedstad A til F, som er slik jeg pleier å gjøre det. Det er bare min foretrukne stil, men enten er fine, de begge representerer ganske mye det samme. Så hvorfor er heksadesimale kult? Hvorfor trenger vi å bruke denne annen tilleggsbase? Vi har allerede to og 10, hvorfor trenger vi 16? Vel 16 er en potens av 2, og så hver heksadesimalsiffer, 0 til f, korresponderer med en unik bestilling, eller unikt arrangement av 4 binære siffer, 4 biter. Og så i den forstand, kan vi uttrykke meget lange, komplekse binære tall i heksadesimal i en mye mer konsis måte, uten å miste informasjon eller å måtte gjøre spesielt tungvint konverter på disse tallene. Så, som jeg sa, hver heksadesimalsiffer korresponderer med en unik arrangement av 4 binære siffer. Så det binære strengen 0000 tilsvarer heksadesimalsiffer 0. 0110 tilsvarer heksadesimalsiffer 6. Og 1111 tilsvarer å heksadesimalsiffer f. Hvis du ser på denne oversikten, spesielt hvis du ser på venstre side av diagrammet, du kan allerede se det er en litt av en tvetydighet problem her. Desimal 0 er ganske mye utvisket fra heksadesimale 0, annet enn det faktum at det er under en kolonne som sier heksadesimale. Men vi vil sannsynligvis ikke alltid har den kolonnen der. Vanligvis når vi uttrykker numre i heksadesimal notasjon å skille klart dem fra titallssystemet, vi vanligvis prefiks dem med prefikset 0x. 0x betyr ingenting i virkeligheten, det er bare et hint til oss som mennesker at det vi er i ferd med å se, eller skal begynne parsing, er et heksadesimalt tall. Tydeligvis for de høyere tallene a, b, c, d og f, som tilsvarer 10-15 det er ganske entydig som er det er et heksadesimalt tall. Og faktisk, et heksadesimalt nummer som har bokstaver i den, er sannsynligvis ganske opplagt som et heksadesimalt tall. Men, likevel, for Av klarhetshensyn er det alltid en god idé å prefiks hver gang du referere til et siffer som heksadesimale nummer med prefikset en 0x. Så, binære, som vi sa, har plass verdier. Det er de sted, et toere sted, en firere sted, og en åttere sted. Og desimal har også sted verdier, enere, tiere, hundre og tusenvis at vi alle kan huske fra grunnskolen. Og heksadesimale er ingen Unntaket her, egentlig. Den har også plass verdier, men i stedet av å være potenser av 2 eller krefter 10, de er krefter 16. Så vi ser et tall som dette vi ganske tydelig vet at det er 397, ikke sant? Vel, hvis vi ser et tall som dette, vi vet at dette er ikke 397 lenger. Dette er den heksadesimale nummer tre-9-7. Det er ikke 397, det betyr noe annerledes, fordi vi bruker krefter av 16 som alle av våre sted verdier i stedet for krefter av 10. Faktisk, stedet verdier her ville være de sted, sixteens sted, og to-hundre-fifty-seksere sted, som tilsvarer vår idé om en seg sted, tiere sted, og en hundrevis sted, hvis antallet var 397. Men siden det er 0x 397, har vi en som sted, sixteens sted, og en to-hundre-fifty-seksere sted. Eller, en 16 til 0 stedet, som er en. En 16 til den første effekt sted, 16. A 16 kvadrerte plass, 256, og så videre, og så videre, og så videre. Så dette nummeret er egentlig 3 ganger 16 squared, pluss 9 ganger 16, pluss 7. Jeg gjorde ikke gjøre regnestykket her, men det er ikke 397, det er mye, mye større enn det. På samme måte kan vi ha 0x ADC, vel det er en ganger 16 kvadrat. Eller hvis vi oversette det til vår forestilling av desimaltall, det er 10 ganger 16 kvadrat, pluss d ganger 16, eller pluss 13 ganger 16. Og ikke bekymre deg hvis du ikke har lagret at d er 13, eller noe sånt, det er ikke for mange av disse brev sifre og det vil bli intuitivt ganske raskt. Så igjen dette er 10 ganger 16 kvadrat, pluss 13 ganger 16, pluss 12 ganger 1. Så 0x ADC. Så, som jeg sa, hver gruppe 4 binære sifre svarer til en enkelt heksadesimale siffer, og så det er faktisk veldig enkelt å endre frem og tilbake mellom hex og binære. Hvis du har denne lang rekke binære siffer, alt du trenger å gjøre blir begynne å gruppere dem rett til venstre som grupper av fire. Og så kan du konsolidere dem inn heksadesimale tall, sterkt begrense antall sifre du har til å behandle mentalt. I stedet for 32 0 og 1-ere, som vi skal se i et sekund, du kan være i stand til å få det ned til kun 8 heksadesimale tall, mye mer konsis. Listene noen lysbilder tilbake, vil hjelpe deg med å finne ut av dette kartlegging, selv, igjen vil du huske det ganske raskt. Vi vil gå gjennom et eksempel akkurat nå. Så hvis vi har et tall som dette, dette virkelig stort antall binære, eller hva synes å være et stort binært tall. Og grunnen til at jeg sier det, er det bare so-- det er en Behemoth, ikke sant? Det er så mange 0 og 1-ere der. Men vi sannsynligvis ikke virkelig har en følelse av hva størrelsen av dette nummeret er virkelig. Vi har ikke noen anelse om hva det ville tilsvare en desimal. Og faktisk vi vil ikke engang se hva det tilsvarer i desimal akkurat nå. Vi kan være i stand til å uttrykke dette på en måte som ville gi oss litt mer informasjon om hvor stort dette tallet er. Så la oss gå til at konverteringsprosessen. Det første vi trenger å gjøre er vi ønsker å gruppere disse tallene ut i grupper av 4, fra høyre og arbeider til venstre. Det måtte være 32 sifre her, noe som betyr at vi har en fin ren pause på 8 grupper på fire. Husk at hver gruppe av 4 her, unikt tilsvarer til et heksadesimalt siffer. Så vi vil starte på nytt å bygge vår nummer fra høyre, og arbeider venstre. Vel, hva er 1 101? Vel vi gjøre regnestykket i hodet, vi har en i åttere sted, en 1 i firere sted, en 0 i toere plass, og en en i seg sted. Det er 8 pluss 4 pluss 1, som vi ville vite som 13. Men vi sannsynligvis ikke ville skrive 13 ut, fordi vi jobber med heksadesimale. Vi trenger å konvertere den til heksadesimale tilsvarende 13, som er f. 0011, vel det er en 0 i åttere sted, 0 i firere sted, en 1 i toere sted, og en en i seg sted. Det er 3. Jeg mener fortsette å gjøre dette igjen, har vi her 9. Og deretter 11, men det er b, tilbakekalling. 2, 10-- a-- eller 6, og 4. Og så veldig store string av 0-er og 1-ere på toppen er mer presist uttrykt i heksadesimal som 0x 46a2b93d. Vel, OK, vi har lært en ny kult spill, hva er poenget? Vi kan ikke bruke alt dette tid, som vi kommer til å snart se, vi bruker heksadesimale ganske mye som programmerere. Ikke nødvendigvis for Hensikten med å gjøre matte med det, men fordi mange ganger minneadresser i vårt system er representert i heksadesimal. Det er en veldig konsis måte å uttrykke ellers tungvinte, binære tall. Og så, igjen, kan du not-- du antakelig ikke kommer til å gjøre noe matte med det, er du ikke kommer til å være å multiplisere heksadesimale tall sammen, eller gjør noe merkelig sånn. Men det er en nyttig ferdighet å ha slik at du kan uttrykke og forstå hukommelse adresser og annen måter å bruke data i C. Jeg er Doug Lloyd, dette er CS50.