Grundlagen der Technischen Informatik

Boolesche Algebra und Schaltalgebra Grundlagen der technischen Informatik Kapitel 2 – Codierung Prof. Dr.-Ing. Axel Hunger Pascal A. Klein, M.Sc. P...
Author: Justus Biermann
14 downloads 0 Views 177KB Size
Boolesche Algebra und Schaltalgebra

Grundlagen der technischen Informatik Kapitel 2 – Codierung

Prof. Dr.-Ing. Axel Hunger Pascal A. Klein, M.Sc.

Prof. Dr.-Ing. Axel Hunger

Grundlagen der Technischen Informatik

Codierung

2. Codierung ........................................................................................ 3  2.1  Einführung in die Codierung .................................................. 3  2.2  Zahlencodes ............................................................................ 4  2.2.1  BCD-Code (Binary Coded Decimal Code) ........................ 7  2.2.2  Aiken-Code......................................................................... 9  2.2.3  3-Exzess-Code .................................................................. 10  2.2.4  Gray-Code ........................................................................ 11  2.2.5  Zusammenfassung ............................................................ 14  2.3  Zeichencodes ........................................................................ 15  2.3.1  Fernschreibecode .............................................................. 16  2.3.2  ASCII................................................................................ 19  2.3.3  EBCDIC ........................................................................... 20  2.4  Codeumsetzer ....................................................................... 22 

2 Prof. Dr.-Ing. Axel Hunger

Grundlagen der Technischen Informatik

Codierung

2.

Codierung

2.1

Einführung in die Codierung

Definition: Code Ein Code ist eine Vorschrift zur eindeutigen Zuordnung der Zeichen einer Menge A (Ausgangsmenge) zu denjenigen Zeichen einer Menge B (Zielmenge). Die Zuordnung muss nicht eindeutig umkehrbar sein, obwohl sie es in den meisten Fällen ist. Zusammengesetzte Zeichen werden dabei als Codewörter bezeichnet. Codierungsregeln legen fest, wie die Zielmenge bei bekannter Ausgangsmenge gebildet wird. Die Codierung dient: •

dem zweckmäßigen und einfachen Übertragen und Verarbeiten von Informationen,



zur Darstellung der Informationen mit einer möglichst geringen Anzahl von Zeichen,



dem Erzielen einer gesicherten Datenübertragung.

3 Prof. Dr.-Ing. Axel Hunger

Grundlagen der Technischen Informatik

Codierung

2.2

Zahlencodes

Von den Zahlencodes sind die Tetradischen1 Codes die am häufigsten verwendeten Codes. Sämtliche Tetradischen Codes verwenden zur Codierung eines beliebigen numerischen Zeichens (einer Ziffer) stets 4 Bit. Sie werden vorrangig zur Darstellung der dezimalen Ziffern benutzt. Die vier Bit zur Darstellung der Dezimalziffern werden als Tetrade bezeichnet. Mit diesen 4 Bit lassen sich 24 = 16 Binärkombinationen bilden. Die zur Darstellung der Dezimalzahlen 0-9 nicht benötigten sechs Tetraden werden als Pseudotetraden bezeichnet. Zur Darstellung einer mehrstelligen Dezimalzahl mittels der Binärzahlen 0 und 1 wird für jede Dezimalstelle eine Tetrade (4 Bit) verwendet. Die Tetradische Codes sind auf ihre unterschiedlichen Anwendungsgebiet abgestimmt. Einige von Ihnen beruhen auf dem Dualsystem, während bei anderen die Stellenwerte nicht mit denen des Dualsystems übereinstimmen. Die wichtigsten Tetradischen Codes sind im Folgenden zum besseren Vergleich in einer gemeinsamen Tabelle 3.1 dargestellt. In der zweiten Zeile sind jeweils die Stellenwerte angegeben. Die Codes sind hinsichtlich ihrer Eignung für diverse Anwendungen auf die folgenden Merkmale hin zu überprüfen. Je mehr Merkmale auf einen Code zutreffen, desto vielseitig anwendbar wird er. • Bewertbarkeit: Die Umwandlung einer binär codierten Zahl ist einfacher, wenn jeder Binärstelle eine Wertigkeit zugeordnet ist. • Komplementierbarkeit: Eine Subtraktion innerhalb einer Rechenanlage geschieht in der Regel durch Addition des Komplements. Daher ist zum Rechnen ein Code von Vorteil, bei dem das (B-1)-Komplement ohne Schwierigkeiten gebildet werden kann.

1

abgeleitet vom griechischen tetra = vier 4 Prof. Dr.-Ing. Axel Hunger

Grundlagen der Technischen Informatik

Codierung

• Konvertierbarkeit: Oftmals müssen binär verschlüsselte Dezimalzahlen in eine Dualzahl konvertiert werden. Dies sollte daher so leicht wie möglich von statten gehen. • Symmetrie: Ein Code ist symmetrisch, wenn seine Tetraden bezüglich der Symmetrielinie(vgl. Tabelle 3.1) symmetrisch ist. Mit anderen Worten wird ein Codewort invertiert, so entsteht das unechte Komplement dieses Codeswortes. Dies wirkt sich vorteilhaft auf arithmetische Operationen aus (vgl. Merkmal Komplementierbarkeit). • Additionsregeln, Übertragsbildung: Entsteht bei der Addition zweier Dezimalzahlen ein Übertrag zur nächst höheren Dezimalstelle, so sollte bei der Addition der entsprechend codierten Dualzahlen ebenfalls ein Übertrag in die nächst höhere Tetrade entstehen. Hex.

Dual

BCD

Aiken

3-Exzess

Gray

8421

8421

2421

keine

keine

0

0

0000 0 0000

0

0000

Pseudo-

0

0000

1

1

0001 1 0001

1

0001

tetraden

1

0001

2

2

0010 2 0010

2

0010

3

0010

3

3

0011 3 0011

3

0011

0

0011

2

0011

4

4

0100 4 0100

4

0100

1

0100

7

0100

5

5

0101 5 0101

2

0101

6

0101

6

6

0110 6 0110

3

0110

4

0110

7

7

0111 7 0111

Pseudo-

4

0111

5

0111

8

8

1000 8 1000

tetraden

5

1000

9

9

1001 9 1001

6

1001

Pseudo-

A

10

1010

7

1010

tetraden

B

11

1011

C

12

1100

D

13

1101

E

14

F

15

Symmetrielinie

5

1011

8

1011

Pseudo-

6

1100

9

1100

tetraden

7

1101

1110

8

1110

Pseudo-

Pseudo

1111

9

1111

tetraden

tetraden

8

1100

9

1101

Tabelle 2.1: Tetradische Codes 5 Prof. Dr.-Ing. Axel Hunger

Grundlagen der Technischen Informatik

Codierung

Die Addition läuft bei allen Zahlencodes nach dem selben Grundprinzip ab. Summanden

Beginn

in Tetraden zerlegen & niedrigstwertige auswählen

aktuelle Tetraden

tetradenweise Addition bis alle addiert

duale Addition

Überprüfung & Korrektur

Übertrag

nächst höhere Tetrade auswählen

tetradenweise Addition

Fertig

Endergebnis als Tetraden

Abbildung 2.2:Addition bei Zahlencodes (nach DIN 66001) Die gegebenen Summanden werden ziffernbzw. tetradenweise dual addiert. Bei der dualen Addition der 6 Prof. Dr.-Ing. Axel Hunger

Grundlagen der Technischen Informatik

Codierung

einzelnen Tetraden werden diese wie zwei vorzeichenlose Dualzahlen der Wortlänge 4 Bit behandelt. Die Addition der gegebenen Zahlen beginnt stets mit den niedrigstwertigen Tetraden der beiden Summanden. Nach der dualen Addition dieser Tetraden werden abhängig vom verwendeten Zahlencode verschiedene Überprüfungen durchgeführt. Durch diese Überprüfungen wird festgestellt, ob eine Korrekturrechnung für die gerade berechnete Tetrade durchgeführt und ob ein Übertrag in die nächst höhere Tetrade berücksichtigt werden muss. Erst danach kann nach selbigem Verfahren mit der Addition der nächst höheren Tetrade fortgefahren werden, wobei hierbei nun ggf. auch noch ein Übertrag zu addieren ist. Der Prozeß "Überprüfung & Korrektur" wird in den folgenden Unterkapiteln für die verschiedenen Zahlencodes genauer spezifiziert. 2.2.1 BCD-Code (Binary Coded Decimal Code) Die Abkürzung BCD steht für binär codierte Dezimalzahlen. Dementsprechend ist der BCD-Code so aufgebaut, dass jede Dezimalziffer 0-9 einfach als Dualzahl geschrieben wird. Daher handelt es sich bei diesem Code auch um eine direkte duale Verschlüsselung. Die Stellenwerte der Tetraden entsprechen demzufolge genau denen des Dualsystems, nämlich (von links nach rechts gelesen): 23 =8, 22 =4, 21 =2, 20 =1. Aufgrund dieser Stellenwertigkeit wird der BCD-Code auch 8-4-2-1-Code genannt. Beispiel: Die vierstelligen Dezimalzahl 1968 lautet im BCD-Code folgendermaßen: 1

9

6

8

0001 1001 0110 1000 Eine Komplementbildung ist ohne weiteres nicht möglich. 7 Prof. Dr.-Ing. Axel Hunger

Grundlagen der Technischen Informatik

Codierung

Die Verfeinerung des Prozesses "Überprüfung & Korrektur" sieht für den BCD-Code wie folgt aus:

ja

Summe =PT? nein

ja

Übertrag

nein

+0II0

keine Korrektur

Abbildung 2.3: Verfeinerung des Prozesses "Überprüfung & Korrektur" für den BCD-Code Tritt bei der dualen Addition ein Übertrag in die nächst höhere Tetrade auf oder entspricht das Additionsergebnis einer Pseudotetrade (PT), so muss eine Korrekturaddition (+610 bzw. + 01102) durchgeführt werden. Beispiel: Addition im BCD-Code 28936 + 48283 Übertrag 1. Summation: Pseudotetrade: Tetraden-Übertrag: Korrektur: Übertrag 2. Summation: = 77219

0010 0100

1000 1000

1001 0010

0011 1000

0111 nein nein

0000 nein ja 0110 1 0111 7

1011 ja

1011 ja

+0110 1111 0010 2

+0110 11 0001 1

1

0111 7

0110 0011

11

1001 nein nein 1001 9

8 Prof. Dr.-Ing. Axel Hunger

Grundlagen der Technischen Informatik

Codierung

2.2.2

Aiken-Code

Beim Aiken-Code handelt es sich um einen symmetrischen Code. Ungerade Dezimalziffern sind genauso wie beim BCDCode durch eine 1 in der niedrigstwertigen Binärstelle gekennzeichnet. Die Binärstellen des Aiken-Code haben (von links nach rechts gelesen) die Stellenwerte 2, 4, 2, 1. Deshalb wird der Aiken-Code auch 2-4-2-1-Code genannt. Aufgrund der symmetrischen Struktur dieses Codes kann das Komplement einfach durch bitweise Invertierung eines Codewortes gebildet werden. Die Verfeinerung des Prozesses "Überprüfung & Korrektur" sieht wie folgt aus: Hierbei wird überprüft, ob das Ergebnis der dualen Addition einer Pseudotetrade (PT) entspricht. Ist dies der Fall, so muss überprüft werden, ob ein Übertrag vorlag. Falls ein Übertrag entstanden ist, wird die Zahl 01102 (610) subtrahiert, ansonsten wird diese Zahl addiert.

ja

ja

Übertrag

Summe =PT?

nein

nein

-0II0

+0II0

keine Korrektur

Abbildung 2.4: Verfeinerung des Prozesses "Überprüfung & Korrektur" für den Aiken-Code 9 Prof. Dr.-Ing. Axel Hunger

Grundlagen der Technischen Informatik

Codierung

Falls ein Übertrag in die nächst höherer Tetrade entsteht, wird dieser auf jeden Fall bei der dualen Addition der nächst höherer Tetrade berücksichtigt. Beispiel: Addition im Aiken-Code

28936 0010 + 48283 0100 1 Übertrag 1. Summation: 0111 Pseudotetrade: ja Tetraden-Übertrag: nein Korrektur: +0110 Übertrag 11 2. Summation: 1101 = 77219 7 2.2.3

1110 1110

1111 0010

0011 1110

11 1

1111

11

1101 nein ja

0010 nein ja

0001 nein ja

1111 nein nein

1101 7

0010 2

0001 1

1111 9

1100 0011

3-Exzess-Code

Der 3-Exzess-Code entsteht aus der Addition der Dualzahl 00112 zu den Worten des BCD-Codes. Hierbei handelt es sich ebenfalls um einen symmetrischen Code, der jedoch im Gegensatz zum BCD- oder Aiken-Code keine Stellenwertigkeit aufweist. Das Komplement kann einfach durch bitweise Invertierung eines Codewortes gebildet werden. Bei der Addition zweier Dezimalzahlen im 3-Exzess-Code, muss nicht geprüft werden, ob eine Pseudotetrade erzeugt wurde. Lediglich das Auftreten eines Übertrages muss kontrolliert werden (vgl. folgende Abb. 3.5). Der gegebenenfalls entstandene Übertrag wird auf jeden Fall bei der dualen Addition der nächst höherer Tetrade berücksichtigt.

10 Prof. Dr.-Ing. Axel Hunger

Grundlagen der Technischen Informatik

Codierung

ja

Übertrag

+00II

nein

-00II

Abbildung 2.5: Verfeinerung des Prozesses "Überprüfung & Korrektur" für den 3-Exzess-Code Beispiel: Addition im 3-Exzess-Code 28936 0101 1011 1100 0110 1001 + 48283 0111 1011 0101 1011 0110 111 1111 11 Übertrag 1111 1. Summation: 1101 0111 0010 0001 1111 Tetraden-Übertrag: nein ja ja ja nein Korrektur: -0011 +0011 +0011 +0011 -0011 Übertrag 1 111 1 11 2. Summation: 1010 1010 0101 0100 1100 = 77219 7 7 2 1 9 2.2.4 Gray-Code Der Gray-Code findet weniger Einsatz in arithmetischen Operationen, sondern wird hauptsächlich für die Analog-DitalUmsetzung benutzt. Der Gray-Code ist ein einschrittiger Code, d.h. beim Übergang von einem Codewort auf das nächstfolgende ändert sich stets nur ein einziges Bit (Binärstelle). Daher können während der Übergänge keine Zwischenwerte auftreten, wie dies beispielsweise beim BCD-Code beim Übergang von dezimal 7 (01112) nach 8 (10002) geschehen kann. In diesem Fall ändern sich nämlich vier Binärstellen auf einmal, so daß kurzzeitig Zwischenwerte auftreten können. Im Extremfall sind dies die 0 (00002) oder die 15 (11112). Dies kann dann zu erheblichen Fehlern führen. 11 Prof. Dr.-Ing. Axel Hunger

Grundlagen der Technischen Informatik

Codierung

Der von E. Gray entwickelte Code wurde von Glixon so geändert, dass bei einem Übergang von dezimal 9 nach 0 sich ebenfalls nur eine Binärstelle ändert, und der Code damit zyklisch wird. Dezimalzahl

ursprünglicher Gray-Code

zyklischer Code nach Glixon

0

0000

0000

1

0001

0001

2

0011

0011

3

0010

0010

4

0110

0110

5

0111

0111

6

0101

0101

7

0100

0100

8

1100

1100

9

1101

1000

Der Gray-Code wird z.B. bei digitalen Meßwaagen, Winkelgebern etc. eingesetzt. In der folgenden Grafik ist eine mit dem Glixon-Code codierte Winkelscheibe abgebildet. Die vier konzentrischen Ringe stellen die vier Binärstellen dar. Der innerste Ring repräsentiert dabei das höchstwertige Bit und ein graues Kreissegment entspricht einer logischen 1. Der aktuelle Wert kann über eine Fotozelle (Scanner) ermittelt werden. Der Gray-Code läßt sich rechnertechnisch aus den Dualzahlen sowohl mittels eines Programms (SW) als auch mit einem Rechenwerk (HW) generieren.

12 Prof. Dr.-Ing. Axel Hunger

Grundlagen der Technischen Informatik

Codierung

9

0 1

8

7

2

6

3 5

4

Abbildung 2.6: Winkelscheibe mit Glixon-Code

13 Prof. Dr.-Ing. Axel Hunger

Grundlagen der Technischen Informatik

Codierung

2.2.5 Zusammenfassung Die folgende Tabelle stellt nochmals die kennengelernten Tetraden-Codes bezüglich ihrer Merkmale gegenüber. Merkmal

BCD Code

Aiken Code

3-Exzess Code

Gray-Code

schlecht, da die Codes keine Bewertbar- gut, da die Codes Stellenwerte aufweisen Stellenwerte aufweisen keit einfache Umrechnung durch findet hier keine Komplement schwierig, da Vertauschen von 1en und 0en in Anwendung -bildung, d.h. eine jeder Stelle, da symmetrische Codes Subtraktion Umrechnung notwendig ist aufwendig Konvertier- direkt identisch Fallunterscheidung einfach immer nötig => ggf. 00112 barkeit Korrekturaddition subtrahieren nicht vorhanden vorhanden nicht vorhanden Symmetrie schwierig, da das Auftreten von einfach, da die schwierig, Code Addition sechs unterschiedlichen PseudoKorrektur nur vom wird jedoch Tetraden erkannt werden muß. Übertrag abhängt i. d . R . nicht für Arithmetik genutzt.

Weiterführende Frage: Wie könnte für die einzelnen Zahlencodes Rechenvorschrift für die Subtraktion lauten?

eine

14 Prof. Dr.-Ing. Axel Hunger

Grundlagen der Technischen Informatik

Codierung

2.3

Zeichencodes

Die Aufgabe alphanumerischer Codes ist die Darstellung und Übertragung von Buchstaben und Ziffern. Hierzu werden in der Praxis auch Zeichen mit besonderer Bedeutung, also Sonderzeichen, gezählt. Der Symbolumfang beträgt daher üblicherweise mindestens: 26 Buchstaben 15 Satzzeichen 10 Sonstige ⎯⎯⎯⎯⎯⎯ 51 Symbole Hieraus ergibt sich eine erforderliche mindestens ld [51] ≈ 5,6 => 6 Bit.

Wortlänge

von

Aus den unterschiedlichen Anforderungen und Möglichkeiten der Datenübertragung in Netzen der Telekommunikation wurden mehrere internationale Normen entwickelt. Je nach historischem Stand der Technik und vorrangiger Aufgabe entstanden Codes von verschiedenem Umfang: Bezeichnung des Codes •

Wortlänge 5 bit

Fernschreibcode CCITT Nr. 2 (5 Spurlochstreifencode, 1932) 26 Buchstaben bzw. Zahlen&Sonderzeichen + 2xUmschalten + Zwischenraum + Lochstreifentransport



7 bit

CCITT Nr. 5 ISO-7-Bit-Code 128 Zeichen (US)ASCII (American Standard Code for Information Interchange)



EBCDIC-Code (Extended Binary Coded Decimal Interchange Code)

8 bit



IBM-Zeichensatz für den PC

8 bit 15

Prof. Dr.-Ing. Axel Hunger

Grundlagen der Technischen Informatik

Codierung

2.3.1 Fernschreibecode Der Fernschreibecode oder Lochstreifencode ist der älteste der genannten Codes. Die folgende Abbildung zeigt exemplarisch einen Lochstreifenabschnitt, der die Nachricht "Komm um 13 Uhr" verschlüsselt.

Zwischenraum

Umschaltung Zahl

Buchst

K OMM UM 1 3 • • • • • • • • • • • x x x x x x x x x x x x x x x • • • • • • • • • • • • • • • • • • • • • • • •

UHR Klartext 1. Informat.spur • 2. Informat.spur • • x x x x x Transportlochung 3. Informat.spur • • 4. Informat.spur • 5. Informat.spur •

Die kleineren Löcher in der Mitte des Lochstreifens dienen dem Transport des Lochstreifens (Transportlochung) und ergeben gleichzeitig eine Art Takt für die Codewortfolgen. Ein Zeichen der codierten Nachricht entspricht einer Spalte auf dem Lochstreifen (1.-5. Informationsspur). Die folgende Tabelle gibt einen Überblick über die so verschlüsselbaren Zeichen. Lochstreifencode, CCITT-Code Nr. 2:

16 Prof. Dr.-Ing. Axel Hunger

Grundlagen der Technischen Informatik

Codierung

Nummer des

Informationsstellen

Code-

Trans port und Takt

Worts

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27

Codierte s Symbol

1 • •

2 • •

• • • •

• •



• • • •

• • •

• • • • • •

• • •

T x x x x x x x x x x x x x x x x x x x x x x x x x x x

3





4 • • • • •

• • • • • • •



• •

• • • • •

• • • • • • •

• •



Ziffern und Sonderzeichen

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
/ ?

Buchstaben & Sonderzeichen 1 0 0 4 @ A B C D E F G H I J K L M N O

1 0 1 5 P Q R S T U V W X Y Z [ \ ] ^ _

1 1 0 6 ` a b c d e f g h i j k l m n o

1 1 1 7 p q r s t u v w x y z { ⏐ } ~ DEL

Tabelle 2.4: CCITT-Code Nr. 5, auch ASCII genannt. 2.3.3

EBCDIC

Der EBCDI-Code (Extended Binary Coded Decimal Interchange Code) wurde von IBM entwickelt. Er erfüllt ähnliche Aufgaben wie der ASCII-Code, verfügt jedoch über deutlich mehr Steuerzeichen für die Steuerung innerhalb von Rechnersystemen. Auch hier soll auf die Bedeutung der Steuerzeichen nicht näher eingegangen werden. 20 Prof. Dr.-Ing. Axel Hunger

Grundlagen der Technischen Informatik

Codierung

8

0

0

1

1

7

0

1

0

1

6

0

0

1

1

0

0

1

1

0

0

1

1

0

0

1

1

5

0

1

0

1

0

1

0

1

0

1

0

1

0

1

0

1

4

3

2

1

0

0

0

0

NUL

DEL

DS

0

0

0

1

SOH

DC1

SOS

0

0

1

0

STX

DC2

FS

0

0

1

1

ETX

TM

0

1

0

0

PF

RES

BYP

0

1

0

1

HT

NL

0

1

1

0

LC

0

1

1

1

DEL

1

0

0

0

1

0

0

1

1

0

1

1

0

1

SP

-

0

/

a

j

A

J

b

k

s

B

K

S

2

c

l

t

C

L

T

3

PN

d

m

u

D

M

U

4

LF

RS

e

n

v

E

N

V

5

BS

ETB

UC

f

o

w

F

O

W

6

IL

ESC

EOT

g

p

x

G

P

X

7

CAN

h

q

y

H

Q

Y

8

RLF

EM

i

r

z

I

R

Z

9

0

SMM

CC

SM

1

1

VT

CU1

CU2

1

0

0

FF

IFS

1

1

0

1

CR

IGS

ENQ

1

1

1

0

SO

IRS

ACK

1

1

1

1

SI

IUS

BEL

SYN

¢

!

CU3

.

$

,

DC4


S1 = f(X3, X2, X1, X0) S2 = f(X3, X2, X1, X0) . . . S7 = f(X3, X2, X1, X0)

2

Schritt 3:

Vereinfachung der Funktionsterme: Entweder jeder für sich alleine betrachtet oder unter Berücksichtigung gemeinsamer Ausdrücke (Funktionsbündel2)

Schritt 4:

Fertigung der Schaltung

Dies ergibt ggf. Vorteile für die spätere hardwaremäßige Realisierung. 23 Prof. Dr.-Ing. Axel Hunger

Grundlagen der Technischen Informatik

Codierung

2. Implementierung mittels Software: 1. Möglichkeit: Schritt 1: Festlegung des Codes, Codeumsetzung ist

der

Zielcode

Schritt 2:

Aufstellen der Zuordnungstabelle

Schritt 3:

Programmierung als table-look-up-Prozeß

der

Schritt 4: Compilieren bzw. Assemblieren des SourceCodes 2. Möglichkeit: Schritt 1: Festlegung des Codes, Codeumsetzung ist

der

Zielcode

der

Schritt 2:

Entwurf eines Algorithmus zur Codeumsetzung

Schritt 3:

Implementierung des Algorithmus

Schritt 4: Compilierung bzw. Assemblieren des SourceCodes Das Prinzip der Implementierung mittels Hardware verdeutlicht die folgende Abbildung.

input: X3aXb2 X c1 dX0

S1 S3

Decoder

S2 S4

S6

S5 S7

Weiterführende Frage: Entwickle eine Schaltung für den Decoder der obigen Schaltung 24 Prof. Dr.-Ing. Axel Hunger

Grundlagen der Technischen Informatik