Hva skal jeg snakke om i dag? Digital representasjon dag@ifi.uio.no Hvordan lagre tall tekst bilder lyd som bit i en datamaskin INF Digital representasjon, høsten 25
Hvordan telle binært? Binære tall Skal vi telle med bit ( og ), må vi telle binært. Dette gjøres egentlig på samme måte som vi teller desimalt: Øk siste siffer med. Hvis vi ikke har flere siffer, sett til og gjenta for sifferet til venstre. Binært Desimalt 2 3 4 5 6 7 8 9 Notasjon Hvis det mulighet for tvil, skriver vi binære tall som 2 og desimale tall som. INF Digital representasjon, høsten 25
Litt matematikk Et matematisk blikk I det desimale tallsystemet har posisjonene vekt,,,,... =,, 2, 3,... (Notasjonen a n («a i n-te») betyr a } a {{ a}.) n ganger I det binære tallsystemet har posisjonene vekt, 2, 4, 8,... = 2, 2, 2 2, 2 3,... 2 = 8 4 2 2 3 2 2 2 2 = INF Digital representasjon, høsten 25
Vi teller igjen Vi teller binært med grupper av bit, f eks byte som inneholder 8 bit: = = = 2. = 26 = 27 = 2 7 Vi stopper når vi kommer til øverste bit. INF Digital representasjon, høsten 25
Hva med negative tall? Negative tall Et negativt tall n lagres i 8 bit som 2 8 + n = 256 + n: = = 256 = 255 = 2 = 3. = 27 = 28 Øverste bit («fortegnsbitet») angir om et tall er negativt. INF Digital representasjon, høsten 25
Hvor store tall kan vi da lagre? Heltall i Java Java tilbyr disse tallene: byte 8 bit 28 +27 short 6 bit 32 768 +32 767 int 32 bit 2 47 483 648 +2 47 483 647 long 64 bit 9 223 372 36 854 775 88 +9 223 372 36 854 775 87 INF Digital representasjon, høsten 25
Hvor store tall kan vi da lagre? Hvorfor er dette viktig? Overflyt.java class Overflyt { public static void main(string arg[]) { int v =, v2 = v*v; } } System.out.println("v=" + v + " og v2=" + v2); gir dette resultatet $ javac Overflyt.java $ java Overflyt v= og v2=333274 INF Digital representasjon, høsten 25
Hvor store tall kan vi da lagre? IkkeOverflyt.java class IkkeOverflyt { public static void main(string arg[]) { long v =, v2 = v*v; } } System.out.println("v=" + v + " og v2=" + v2); gir riktig svar: $ javac IkkeOverflyt.java $ java IkkeOverflyt v= og v2= INF Digital representasjon, høsten 25
Hvor store tall kan vi da lagre? Heksadesimal notasjon Det er lett å gjøre feil når man jobber med binære tall:...... Det er enklere å erstatte fire og fire binære sifre med heksadesimale sifre 6 F 6 : }{{} }{{} }{{} }{{} }{{} }{{} }{{} }{{} F 6 E 6 D 6 C 6 B 6 A 6 9 6 8 6 }{{} }{{} }{{} }{{} }{{} }{{} }{{} }{{} 7 6 6 6 5 6 4 6 3 6 2 6 6 6 INF Digital representasjon, høsten 25
Hvor store tall kan vi da lagre? Oktal notasjon Tidligere brukte man ofte oktal notasjon der man slår sammen tre og tre bit: }{{} }{{} }{{} }{{} }{{} }{{} }{{} }{{} 7 8 6 8 5 8 4 8 3 8 2 8 8 I dag har hex-notasjonen overtatt. 8 INF Digital representasjon, høsten 25
Men det finnes flere tall... Men hva med disse tallene? Andromedagalaksen er 24 29 742 km unna. π = 3,459265 Et H-atom er, 96 mm stort. Vi trenger ikke bare heltall men også tall som kan ha veldig små og veldig store verdier kan ha desimaler ikke behøver å være helt nøyaktige. INF Digital representasjon, høsten 25
Flyttall er løsningen Løsningen i det desimale tallsystemet er å oppgi tallet med -erpotens: Andromedagalaksen er 2,4 9 km unna. π = 3,459265 Et H-atom er 9,6 8 mm stort. Så lagrer vi både den justerte tallverdien (9,6) og -erpotensen ( 8). På en datamaskin gjør vi det samme, men bruker vi 2-erpotenser i float og double. 3 3 23 22 S 2-erpotens Tallverdien INF Digital representasjon, høsten 25
Flyttall er løsningen I Java har vi disse flyttallene: Minste Største float 32 bit 7 sifre,2 38 3,4 38 double 64 bit 6 sifre 2,2 38,8 38 Vi kan konvertere mellom heltall og flyttall: Konvertering.java class Konvertering { public static void main(string arg[]) { double f = 3.94, f2; int i; } } i = (int)f; f2 = (double)i; System.out.println("i=" + i + " og f2="+f2); Svaret blir: i=3 og f2=3. INF Digital representasjon, høsten 25
Trenger jeg bekymre meg for dette? Er dette viktig? FloatTest.java class FloatTest { public static void main(string arg[]) { double a =.234567892345678923456789; } } System.out.printf("a=%.3f\n", a); fungerer slik: $ javac FloatTest.java $ java FloatTest a=.23456789234567 INF Digital representasjon, høsten 25
Kan vi lagre tegn som tall? Tekster Hvordan lagrer vi tegn i datamaskinen? Det er lett: Sett opp en tabell over tegn vi trenger og gi hvert tegn et nummer. INF Digital representasjon, høsten 25
Er det virkelig så enkelt? Problemet Hva hvis ikke alle bruker samme tabell? INF Digital representasjon, høsten 25
Mange gode forsøk ASCII Første vellykkede forsøk på standardisering var ASCII (American standard code for information interchange) i 963: INF Digital representasjon, høsten 25
Mange gode forsøk + ASCII ble etter hvert brukt av de fleste. + Det er lett å sjekke om et tegn er et siffer eller en bokstav. + Det er lett å konvertere fra liten til stor bokstav. Mangler ÆØÅ og andre bokstaver og tegn. Det siste ga opphav til et utall av lokale varianter der for eksempel [\]{ } ble erstattet av ÆØÅæøå. Dette førte til «Gj vik-syndromet». INF Digital representasjon, høsten 25
April 995, DFL, Ifi/UiO Oversikt Tall Tekst Bilder Lyd Slutt Mange gode forsøk Latin- En klart bedre løsning ble ISO 8859- (Latin-). Den (og varianter) er ennå i bruk. 2 2 2 3 3 3 4 4 4 5 5 5 6 6 6 7 7 7 8 8 9 9 2 A 3 B 2 4 C 3 5 D 4 6 E 5 7 F 6 2 7 2 8 22 2 9 23 3 2 24 4 2 25 5 22 26 6 23 27 7 24 3 8 25 3 9 26 32 A 27 33 B 28 34 C 29 35 D 3 36 E 3 37 F ISO 8859 4 64 96 4 28 2 6 24 32 2 33 4! " # $ % & ( ) * +,. / 2 3 4 5 6 7 8 9 : ; < = >? 2 34 42 22 35 43 23 36 44 24 37 45 25 38 46 26 39 47 27 4 5 28 4 5 29 42 52 2A 43 53 2B 44 54 2C 45 55 2D 46 56 2E 47 57 2F 48 6 3 49 6 3 5 62 32 5 63 33 52 64 34 53 65 35 54 66 36 55 67 37 56 7 38 57 7 39 58 72 3A 59 73 3B 6 74 3C 6 75 3D 62 76 3E 63 77 3F @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ 4 65 4 66 2 42 67 3 43 68 4 44 69 5 45 7 6 46 7 7 47 72 48 73 49 74 2 4A 75 3 4B 76 4 4C 77 5 4D 78 6 4E 79 7 4F 8 2 5 8 2 5 82 22 52 83 23 53 84 24 54 85 25 55 86 26 56 87 27 57 88 3 58 89 3 59 9 32 5A 9 33 5B 92 34 5C 93 35 5D 94 36 5E 95 37 5F a b c d e f g h i j k l m n o p q r s t u v w x y z { } ~ 6 97 4 6 98 42 62 99 43 63 44 64 45 65 2 46 66 3 47 67 4 5 68 5 5 69 6 52 6A 7 53 6B 8 54 6C 9 55 6D 56 6E 57 6F 2 6 7 3 6 7 4 62 72 5 63 73 6 64 74 7 65 75 8 66 76 9 67 77 2 7 78 2 7 79 22 72 7A 23 73 7B 24 74 7C 25 75 7D 26 76 7E 27 77 7F 8 29 2 8 3 22 82 3 23 83 32 24 84 33 25 85 34 26 86 35 27 87 36 2 88 37 2 89 38 22 8A 39 23 8B 4 24 8C 4 25 8D 42 26 8E 43 27 8F 44 22 9 45 22 9 46 222 92 47 223 93 48 224 94 49 225 95 5 226 96 5 227 97 52 23 98 53 23 99 54 232 9A 55 233 9B 56 234 9C 57 235 9D 58 236 9E 59 237 9F A 6 24 ª «± ² ³ µ ¹ º» ¼ ½ ¾ A 62 242 A2 63 243 A3 64 244 A4 65 245 A5 66 246 A6 67 247 A7 68 25 A8 69 25 A9 7 252 AA 7 253 AB 72 254 AC 73 255 AD 74 256 AE 75 257 AF 76 26 B 77 26 B 78 262 B2 79 263 B3 8 264 B4 8 265 B5 82 266 B6 83 267 B7 84 27 B8 85 27 B9 86 272 BA 87 273 BB 88 274 BC 89 275 BD 9 276 BE 9 277 BF À Á Â Ã Ä Å Æ Ç È É Ê Ë Ì Í Î Ï Ð Ñ Ò Ó Ô Õ Ö Ø Ù Ú Û Ü Ý Þ ß 92 3 C 93 3 C 94 32 C2 95 33 C3 96 34 C4 97 35 C5 98 36 C6 99 37 C7 2 3 C8 2 3 C9 22 32 CA 23 33 CB 24 34 CC 25 35 CD 26 36 CE 27 37 CF 28 32 D 29 32 D 2 322 D2 2 323 D3 22 324 D4 23 325 D5 24 326 D6 25 327 D7 26 33 D8 27 33 D9 28 332 DA 29 333 DB 22 334 DC 22 335 DD 222 336 DE 223 337 DF à á â ã ä å æ ç è é ê ë ì í î ï ð ñ ò ó ô õ ö ø ù ú û ü ý þ ÿ 224 34 E 225 34 E 226 342 E2 227 343 E3 228 344 E4 229 345 E5 23 346 E6 23 347 E7 232 35 E8 233 35 E9 234 352 EA 235 353 EB 236 354 EC 237 355 ED 238 356 EE 239 357 EF 24 36 F 24 36 F 242 362 F2 243 363 F3 244 364 F4 245 365 F5 246 366 F6 247 367 F7 248 37 F8 249 37 F9 25 372 FA 25 373 FB 252 374 FC 253 375 FD 254 376 FE 255 377 FF INF Digital representasjon, høsten 25
Den endelige løsningen Unicode Men det er bare én løsning: en tegnkoding som omfatter alle skriftspråk i verden. Den heter Unicode og er nå stort sett ferdig. Unicode skal omfatte alle skriftspråk som brukes eller har vært brukt Det er plass til drøyt tegn. 87 tegn er foreløbig definert. Mer og mer programvare (som Java) støtter Unicode. INF Digital representasjon, høsten 25
Den endelige løsningen UTF-8 Hvordan lagre Unicode-tekst uten å bruke for mye plass på disk eller over nettet? UTF-8 bruker fra til 4 byte til å lagre et tegn: $ U+24 U+A2 =C U+2AC U+384 Unicode og UTF-8 er nå standard ved Ifi. INF Digital representasjon, høsten 25
Hva er et bilde? Bilder Et bilde kan vises på en LCD-fargeskjerm med de tre RGB-fargene: Rød Grønn Blå (Utskrift på papir bruker CMYK (Cyan, Magenta, Yellow, black) i stedet.) INF Digital representasjon, høsten 25
Oversikt Tall Tekst Bilder Lyd Slutt Et veldig enkelt eksempel på et rasterbilde Et eksempel På Ifis hjemmeside finnes et «favicon». INF Digital representasjon, høsten 25
Et veldig enkelt eksempel på et rasterbilde Dette er et rasterbilde på 6 6 ruter. I hver rute angir vi RGB-verdiene; her Mørk rød: R=83/255, G=47/255, B=36/255 Gjennomsiktig INF Digital representasjon, høsten 25
Er det mulig å komprimere rasterbilder? Et rasterbilde kan ta stor plass: Favicon-en til UiO er på 6 6 3 byte = 768 B Et skjermbilde kan være på 92 2 3 byte = 6,9 MB Er det mulig å komprimere dette? INF Digital representasjon, høsten 25
Er det mulig å komprimere rasterbilder? Fargetabell Hvis det ikke er mange ulike farger, bruk en tabell over fargene. Vårt favicon trenger da + 6 + 6 6 8 byte = 39 B INF Digital representasjon, høsten 25
Er det mulig å komprimere rasterbilder? «Run-length»-koding I et rasterbilde er ofte piksler ved siden av hverandre like. 6 6 5, 6, 5 5, 6, 5 5, 6, 5 5, 6, 5 5, 6, 5 5, 6, 5 6 5, 6, 5 5, 6, 5 5, 6, 5 5, 6, 5 5, 6, 5 5, 6, 5 6 INF Digital representasjon, høsten 25
Oversikt Tall Tekst Bilder Lyd Slutt Og om vi er villig til å godta en reduksjon i kvaliteten? For fotografier gjelder dette: På fotografier er det sjelden brå overganger. Vi mennesker kan bare skjelne et begrenset antall nyanser. Vi søker automatisk etter mønstre. INF Digital representasjon, høsten 25
Og om vi er villig til å godta en reduksjon i kvaliteten? JPEG-formatet JPEG benytter dette til å lage en forenklet versjon av bildet. Ekte rasterbilde JPEG % JPEG 5% JPEG 25% JPEG % JPEG 5% 4,7 MB 5,5 MB,94 MB,6 MB,34 MB,24 MB (Dette er komprimering med tap. Det er umulig å komme tilbake til det opprinnelige bildet.) INF Digital representasjon, høsten 25
Oversikt Tall Tekst Bilder Lyd Slutt Originalbildet % INF Digital representasjon, høsten 25
Kvalitet 5% INF Digital representasjon, høsten 25
Kvalitet 25% INF Digital representasjon, høsten 25
Kvalitet % INF Digital representasjon, høsten 25
Kvalitet 5% INF Digital representasjon, høsten 25
Oversikt Tall Tekst Bilder Lyd Slutt En sammenligning Original INF Digital representasjon, høsten 25 Kvalitet 5%
Men hva med vektorer? Vektorgrafikk Det er også mulig å lagre bilder som linjer og kurver: ifi-logo.eps : newpath 38.494 2.83464 moveto 38.494 5.44878 lineto 28.3464 5.44878 lineto 2.3242 5.44878 4.93857 2.286 4.93857 28.3464 curveto 4.93857 35.7735 lineto 36.56685 35.7735 lineto 36.56685 48.38728 lineto 2.32443 48.38728 lineto 2.32443 28.3464 lineto 2.32443 4.6295 4.667 2.83464 28.3464 2.83464 curveto closepath stroke : INF Digital representasjon, høsten 25
Men hva med vektorer? Raster Vektor INF Digital representasjon, høsten 25
Hva skal jeg bruke? Anbefalinger Bruk vektorgrafikk om mulig: SVG, EPS, PDF. For fotografier bruk JPEG i så god kvalitet som mulig. For annen rastergrafikk bruk PNG med så mange piksler som mulig. INF Digital representasjon, høsten 25
Hva er lyd? Hvordan lagre lyd Lyd er bølger i luft, men de kan overføres som strøm: INF Digital representasjon, høsten 25
Hvordan kan vi lagre lyd? Vi kan lagre lyden ved å måle strømmen med jevne mellomrom: Men for å lagre digitalt må vi måle styrken i faste intervaller: INF Digital representasjon, høsten 25
Hvordan kan vi lagre lyd? Med disse målingene kan vi gjenskape lyden (men ikke helt nøyaktig): INF Digital representasjon, høsten 25
Men hva med lydkvaliteten? Kvaliteten på lyden blir da avhengig av hvor ofte vi måler hvor mange trinn vi benytter til målingen CD En vanlig CD har 74 minutter spilletid med god lyd: 44 målinger («samples») per sekund 2 6 = 65 536 intervaller (dvs 2 byte) 2 kanaler + 37% feilkorreksjonsdata En CD må derfor ha plass til 783 MB. INF Digital representasjon, høsten 25
Kan vi komprimere lyd? Er det mulig å spare plass? Høyre og venstre kanal er stort sett nesten like. Det er lurere å lagre venstre kanal samt forskjellen. I stedet for å lagre hver måling med sin verdi, holder det å lagre forskjellen. Men: På grunn av feil og spoling må man av og til lagre den ekte verdien. INF Digital representasjon, høsten 25
Kan vi komprimere lyd? Enda mer plass kan vi spare om vi tar hensyn til hvordan vi mennesker hører: MP3 Vi kan ikke høre lyder under 2 Hz og over 2 Hz. Om vi hører en kraftig lyd med én frekvens, hører vi ikke litt svakere lyder med noe høyere frekvens. Etter å ha hørt en sterk lyd, hører vi dårligere en tid etterpå (inntil,2 s). MP3 utnytter dette og tillater til dels sterk komprimering: Ekte CD MP3 «CD-kvalitet» MP3 «FM-radio» MP3 «telefonkvalitet» 4 kb/s ca 2 kb/s ca 6 kb/s ca kb/s INF Digital representasjon, høsten 25
Hva har vi nevnt i dag? Oppsummering Alt er bit i en datamaskin. Det finnes ulike typer tallverdier, og programmereren må velge riktig. Det er mange ulike tegnkodinger å forholde seg til (ennå). Rasterbilder og vektorbilder er nyttige til hvert sitt formål. Lydkoding med MP3 er blitt en standard, men vi kan velge kvaliteten. INF Digital representasjon, høsten 25