Innehåll. 1 Typer. 2 C-strängar. 3 union. 4 Bitoperationer. 5 Komma-operatorn. struct Foo; void print ( const Foo& f) } void print (int i)

Relevanta dokument
Innehåll. Heltalstyper. Heltalstyper. Heltalstyper Storlekarna specificeras i <climits>

TDIU01 - Programmering i C++, grundkurs

Tecken. char. char ch = A ; sizeof(char) = 1 byte (ej 16-bitars tecken som i Java) char namn[]= "Nils"; // längd = 5 bytes

Datatyper och kontrollstrukturer. Skansholm: Kapitel 2) De åtta primitiva typerna. Typ Innehåll Defaultvärde Storlek

C++ - En introduktion

Programmering i C++ EDAF hp. EDAF30 (Föreläsning 2) HT / 18

Innehåll. Pekare Exempel

Programmering i C++ EDA623 Typer. EDA623 (Föreläsning 4) HT / 33

Innehåll. Pekare Exempel

Innehåll. Resurshantering. Resource handles. Minnesallokering. Minnesallokering Exempel: allokering på stacken. 6. Resurshantering

TDIU01 - Programmering i C++, grundkurs

Enkla datatyper minne

Programmering i C++ EDA623 Strömmar och filer. EDA623 (Föreläsning 9) HT / 19

Innehåll. EDAf30: Programmering i C++, 7.5 hp. EDAf30: Programmering i C++, 7.5 hp Viktiga skillnader mot Java

Innehåll. 1 Deklarationer, scope och livstid. 2 Användardefinierade typer. 4 In- och utmatning. 5 Operatoröverlagring. 6 namnrymder (namespace)

Översikt Introduktion DST 1. Nicholas Wickström. IDE, Högskolan i Halmstad. N. Wickström

Innehåll. 1 Deklarationer, scope och livstid. 2 Användardefinierade typer. 4 Operatoröverlagring. 5 In- och utmatning. 6 namnrymder (namespace)

TDIU01 (725G67) - Programmering i C++, grundkurs

C++-programmets beståndsdelar

Byggstenar. C++-programmets beståndsdelar. C++-programmets beståndsdelar. Grundläggande datatyper

Programmera i C Varför programmera i C när det finns språk som Simula och Pascal??

Innehåll. Användardefinierade typer. Användardefinierade typer Kategorier. Konstruktorer. Konstruktorer Två sätt att skriva initiering av medlemmar

EDAf30: Programmering i C++, 7.5 hp. EDAf30: Programmering i C++, 7.5 hp Administration. EDAf30: Programmering i C++, 7.5 hp Obligatoriska moment

Innehåll. Pekare Syntax

Innehåll. Typomvandlingar (casting) Implicita Typomvandlingar. Typomvandlingar (casting) Implicita Typomvandlingar

TDIU01 - Programmering i C++, grundkurs

TDIU01 - Programmering i C++, grundkurs

Programmering A. Johan Eliasson

TDIU01 - Programmering i C++, grundkurs

Innehåll. 1 Funktionsmallar. 2 Pekare och konstanter. 3 Typomvandlingar. struct Name { string s; //... };

Klassdeklaration. Metoddeklaration. Parameteröverföring

Innehåll. Typomvandlingar (casting) Implicita Typomvandlingar. Typomvandlingar (type casts) Explicita, namngivna typomvandlingar (C++-11)

Dagens föreläsning. Repetition. Repetition - Programmering i C. Repetition - Vad C består av. Repetition Ett första C-program

Dagens föreläsning. Repetition. Repetition - Programmering i C. Repetition - Vad C består av. Repetition Ett första C-program

Data, typ, selektion, iteration

TDDC76 - Programmering och Datastrukturer

Programmering i C++ EDA623 Mer om klasser. EDA623 (Föreläsning 6) HT / 26

TDIU01 Programmering i C++

Grunderna i C++ T A. Skapad av Matz Johansson BergströmLIMY

Innehåll. 1 Kort om dynamisk polymorfism. 2 Arv i C++ 3 Multipelt arv. 4 Något om statisk polymorfism. class Container {

TDDC76 - Programmering och Datastrukturer

Innehåll. Exceptionella händelser (exceptions, undantag ) Felhantering Tre nivåer av felhantering: Nivå 2: exceptions (eller returvärde)

1 Funktioner och procedurell abstraktion

TDIU20 - Objektorienterad programmering i c++ - föreläsning 4

Programmering i C. Vad är C? Målsättning. Litteratur. Jämförelse med Java. Exempel : Ett program som skriver ut texten Hello, world

Objektorienterad Programmering (TDDC77)

Innehåll. Resource handles. Resurshantering. Minnesallokering. Minnesallokering Exempel: allokering på stacken. 7. Resurshantering, Felhantering

1 Datorn som miniräknare. 1.1 Räkneoperationer. 1.2 Variabler

C++ - En introduktion

1 Texthantering. 1.1 Typen char. Exempel, skriv ut alfabetet

Innehåll. Pekaren this Självreferens. Klasser Resurshantering, representation. Överlagring av operatorer. Överlagring av operatorer

Idag. Javas datatyper, arrayer, referenssemantik. Arv, polymorfi, typregler, typkonvertering. Tänker inte säga nåt om det som är likadant som i C.

Operatoröverlagring. endast operatorsymboler definierade i C++ kan överlagras = += -= *= /= %= ^= &= = <<= >>= < > <= >= ==!= && > ->*, [ ] ( )

Grundläggande C-programmering del 2 Pekare och Arrayer. Ulf Assarsson

2D1387, Programsystemkonstruktion med C++ Johnny Bigert, Kursens hemsida:

C konstruerades i början på sjuttiotalet av Dennis Ritchie vid Bell Laboratories.

I Skapa Hej.java och skriv programmet. I Kompilera med javac Hej.java. I Rätta fel och repetera tills du lyckas kompilera ditt program

Objektorienterad Programmering (TDDC77)

Grundläggande C-programmering del 2 Pekare och Arrayer. Ulf Assarsson

TDIU01 - Programmering i C++, grundkurs

OBS! All teori i detta och följande dokument kompletteras med genomgångar på lektionerna. Så det är viktigt att närvara och göra egna anteckningar.

Innehåll. Konstruktorer vid arv Regler för basklassens konstruktor. Konstruktorer vid arv. Konstruktorer vid arv. Konstruktorer vid arv

Innehåll. 1 Typdeklarationer och typomvandling 2 Resurshantering. 3 Objektorientering, kort repetition. 4 Klasser

Ulf Assarsson. Grundläggande C-programmering del 2 Pekare och Arrayer. Läromoment:

C++ Funktioner 1. int summa( int a, int b) //funktionshuvud { return a+b; //funktionskropp } Värmdö Gymnasium Programmering B ++ Datainstitutionen

Innehåll. 1 Funktionsmalllar. 2 Klassmallar. struct Name { string s; //... }; const Name & minimum ( const Name & a, const Name & b) { if(a.s < b.

Programmering i C++ En manual för kursen Datavetenskaplig introduktionskurs 5p

TDDC76 - Programmering och Datastrukturer

732G Linköpings universitet 732G11. Johan Jernlås. Översikt. Repetition. Felsökning. Datatyper. Referenstyper. Metoder / funktioner

Kapitel 1. C++-programmets beståndsdelar. C++-programmets beståndsdelar. Kapitel 1 grunderna i C++

Inledande programmering med C# (1DV402) 27+15=42 1 (22)

6 Lågnivåprogrammering

Tillämpad programmering

Programmering av inbyggda system. Pekare och Arrayer. Viktor Kämpe

Kompilering och exekvering. Föreläsning 1 Objektorienterad programmering DD1332. En kompilerbar och körbar java-kod. Kompilering och exekvering

E02 "The Review" Föreläsning 2, HT2013 Grunderna, repetition. Johan Leitet. Kurs: 1dv403 Webbteknik I

Föreläsning 3: Typomvandling, villkor och val, samt textsträngar

Tentamen EDAF30 Programmering i C++

Vad har vi lärt oss så här långt Vad är en sträng? Strängkonstanter. Att skriva ut och läsa in strängar. Att arbeta med strängar.

Innehåll. Parametriserade typer. Klassmallar. Klassmallen Vektor Konstructor med std::initializer_list. Klassmallen Vektor Medlemsfunktioner

Övning från förra gången: readword

IS1200 Datorteknik. Övning CE_O4 Maskinnära programmering med C Förberedelser till hemlaboration 1

1 Namnkontroll (NameControl)

Tentamen EDAF30 Programmering i C++

Exempelsamling Assemblerprogrammering

Parameteröverföring. Exempel. Exempel. Metodkropp

FÖRSLAG TILL LÖSNING AV Tentamen i Objektorienterad programmering C++ I

Föreläsning 1: Momstabellen i C++

4. Standard-containers. Strömmar och filer

float Mindre rella tal ( floating point number ) double Rella tal/flyttal ( double precision floating point number )

Programmering med Java. Grunderna. Programspråket Java. Programmering med Java. Källkodsexempel. Java API-exempel In- och utmatning.

4 Sammansatta datatyper

Föreläsning 2 Programmeringsteknik och C DD1316. Mikael Djurfeldt

F5 Selektion och iteration. ID1004 Objektorienterad programmering Fredrik Kilander

Övning2. Variabler. Data typer

(Man brukar säga att) Java är... Denna föreläsning. Kompilering av Java. Historik: Java. enkelt. baserat på C/C++ Allmänt om Java

Innehåll. 1 volatile. 2 Kuriositeter. 3 Klasser och arv. 4 Råd och tumregler. 5 Mer om standard-containers. Trigraphs

Innehåll. Introduktion till objektorientering. OOP (objektorienterad programmering) Objekt, instanser, klasser

Del6 Strömmar Ämnesområden denna föreläsning:

Instuderingsfrågor till Steg 1

Transkript:

Innehåll EDAF30 Programmering i C++ 11. Lågnivå-detaljer Sven Gestegård Robertz Datavetenskap, LTH 2017 1 Typer Flyttalstyper 2 C-strängar Standardbibliotek för C-strängar 3 4 Bitoperationer bit-fält <bitset> 5 Komma-operatorn 11. Lågnivå-detaljer 2/1 Argument Dependent Lookup (ADL) Argument Dependent Lookup (ADL) namespace test struct Foo Foo ( int v) :xv int x; ; std :: ostream & operator <<(std :: ostream & o, const Foo & f) return o << " Foo (" << f.x << ")"; // namespace test test :: Foo f (17); cout << f << endl ; The function operator<<(ostream&, const Foo&) is not visible in main(). Through ADL it is found in the namespace of its argument (test). 11. Lågnivå-detaljer 3/34 namespace test struct Foo; std :: ostream & operator <<(std :: ostream & o, const Foo& f); void print ( const Foo& f) cout << f << endl ; void print (int i) cout << i << endl ; // namespace test test :: Foo f (17); print (f); print (17); test :: print (17); The functions test::operator<<() and test::print(const Foo&) are found through ADL. The function test::print(int) is not found. unless using test::print. 11. Lågnivå-detaljer 4/34 heltal med tecken Typ Storlek Talområde (minst) signed char 8 bitar [ 127, 127] short minst 16 bitar [ 2 15 + 1, 2 15 1] int minst 16 bitar, oftast 32 [ 2 15 + 1, 2 15 1] long minst 32 bitar [ 2 31 + 1, 2 31 1] long long minst 64 bitar [ 2 63 + 1, 2 63 1] typiskt [ 128, 127], etc. unsigned(icke-negativa) heltal samma storlek som motsvarande signed typ unsigned char: [0, 255], unsigned short: [0, 2 16 1]. etc. specialfall char (får representeras som signed char eller unsigned char) Använd char endast för att lagra tecken Använd signed char eller unsigned char för talvärden Storlekar enligt standarden: char short int long long long Typer : 11. Lågnivå-detaljer 5/34 Test med sizeof # include <iostream > using namespace std; cout << " sizeof (char )= \t" << sizeof (char )<< endl ; cout << " sizeof (short )= \t" << sizeof (short ) <<endl ; cout << " sizeof (int) = \t" << sizeof (int ) <<endl ; cout << " sizeof (long )= \t" << sizeof (long )<< endl ; sizeof ( char )= 1 sizeof ( short )= 2 sizeof (int) = 4 sizeof ( long )= 8 Typer : 11. Lågnivå-detaljer 6/34

Test av talområdet via casting eller: se upp med typecasts från signed till unsigned-typer Storlekarna specificeras i <climits> cout << "(char ) -1 = " << (int )( char ) -1 << endl ; cout << "( unsigned char ) -1 = " << (int )( unsigned char ) -1 << endl ; cout << "( short int) -1 = " << ( short int) -1 << endl ; cout << "( unsigned short int ) -1 = " <<( unsigned short int )-1<< endl ; cout << "( int ) -1 = " << ( int ) -1 << endl ; cout << "( unsigned int ) -1 = " << ( unsigned int ) -1 << endl ; cout << "( long ) -1 = " << ( long ) -1 << endl ; cout << "( unsigned long ) -1 = " << ( unsigned long ) -1 << endl ; ( char ) -1 = -1 ( unsigned char ) -1 = 255 ( short int ) -1 = -1 ( unsigned short int ) -1 = 65535 ( int ) -1 = -1 ( unsigned int ) -1 = 4294967295 ( long ) -1 = -1 ( unsigned long ) -1 = 18446744073709551615 CHAR_BIT Number of bits in a char object (byte ) ( >=8) SCHAR_MIN Minimum value for an object of type signed char SCHAR_MAX Maximum value for an object of type signed char UCHAR_MAX Maximum value for an object of type unsigned char CHAR_MIN Minimum value for an object of type char ( either SCHAR_MIN or 0) CHAR_MAX Maximum value for an object of type char ( either SCHAR_MAX or UCHAR_MAX ) SHRT_MIN Minimum value for an object of type short int SHRT_MAX Maximum value for an object of type short int USHRT_MAX Maximum value for an object of type unsigned short int INT_MIN Minimum value for an object of type int INT_MAX Maximum value for an object of type int UINT_MAX Maximum value for an object of type unsigned int LONG_MIN Minimum value for an object of type long int LONG_MAX Maximum value for an object of type long int ULONG_MAX Maximum value for an object of type unsigned long int LLONG_MIN Minimum value for an object of type long long int LLONG_MAX Maximum value for an object of type long long int ULLONG_MAX Maximum value for an object of type unsigned long long Typer : 11. Lågnivå-detaljer 7/34 Typer : 11. Lågnivå-detaljer 8/34 Storlekarna specificeras i <climits> Flyttalstyper # include <iostream > # include <climits > std :: cout << CHAR_MIN << ", " << CHAR_MAX << ", "; std :: cout << UCHAR_MAX << std :: endl ; std :: cout << SHRT_MIN << ", " << SHRT_MAX << ", "; std :: cout << USHRT_MAX << std :: endl ; std :: cout << INT_MIN << ", " << INT_MAX << ", "; std :: cout << UINT_MAX << std :: endl ; std :: cout << LONG_MIN << ", " << LONG_MAX << ", "; std :: cout << ULONG_MAX << std :: endl ; std :: cout << LLONG_MIN << ", " << LLONG_MAX << ", "; std :: cout << ULLONG_MAX << std :: endl ; 128, 127, 255-32768, 32767, 65535-2147483648, 2147483647, 4294967295-9223372036854775808, 9223372036854775807, 18446744073709551615-9223372036854775808, 9223372036854775807, 18446744073709551615 Typer : 11. Lågnivå-detaljer 9/34 float (oftast 32 bitar) double (oftast 64 bitar) long double IEEE 754 32-bitars flyttal: 1 + 8 + 23 bitar (tecken + exponent + mantissa) värde = 1 sign (1.b 22 b 21... b 0 ) 2 2 (b30b20...b23) 2 ( 127 = 1 sign 1 + ) 23 i=1 b 23 i 2 i 2 exponent 127 exponent = 0x7c = 124 värde = +1.01 2 2 124 127 = 1.25 2 3 = 1.25 0.125 Typer : Flyttalstyper 11. Lågnivå-detaljer 10/34 Flyttalstyper C-strängar Detaljer och varningar Test med sizeof # include <iostream > using namespace std ; cout << " sizeof (float )=" << sizeof ( float )<< endl ; cout << " sizeof ( double )=" << sizeof ( double ) << endl ; cout << " sizeof (long double )=" << sizeof ( long double ) << endl ; sizeof ( float )=4 sizeof ( double )=8 sizeof ( long double )=12 en c-sträng är en null-terminerad char[] har inget skyddsnät kräver funktioner ur C-standardbiblioteket för jämförelse, att ta reda på längden, kopiering, etc. I <cfloat> definieras minsta värde, största värde, epsilon, mm. Typer : Flyttalstyper 11. Lågnivå-detaljer 11/34 C-strängar 11. Lågnivå-detaljer 12/34

Inmatning Varnande exempel C-strängar Funktioner Den lästa strängen får inte plats i x Satserna char z[] " zzzz "; char y[] " yyyy "; char x [5]; stringstream sin " aaaaaaaaaaaaaaaaaa bbbbbb "; sin >> x; cout << x << " : " << y << " : " << z << endl ; Ger vid körning (på min dator): aaaaaaaaaaaaaaaaaaa : aa : zzzz C-strängar ger inget skyddsnät läsningen till x har skrivit över (en del av) y getline() är säkrare In- och utmatning av tecken # include <cstring > // Bibliotek att inkludera strcpy (s,t) // Kopierar t till s strncpy (s,t,n) // Variant med max n tecken strcat (s,t) // Lä gger till t till slutet av s strncat (s,t,n) // Variant med max n tecken strlen (s) // Returnerar lä ngden av s strcmp (s,t) // Jämför s och t strncmp (s,t,n) // Variant med max n tecken // s<t, s==t, s>t ger resp. <0, =0, >0 Osäkra, undvik! C-strängar 11. Lågnivå-detaljer 13/34 C-strängar : Standardbibliotek för C-strängar 11. Lågnivå-detaljer 14/34 Initiering och tilldelning Strängkopiering Varnande exempel Initiering char s [4]= " abc "; // OK char s[] = " abc "; // OK char s [3]= " abc "; // Inte OK ( pga \0) Tilldelning s = " def "; // Felaktigt! s [0]= d ; s [1]= e ; s [2]= f ; // OK // Bä ttre variant : strncpy (s, "def ", 4); // kräver # include <cstring > Satserna char s [20]; strncpy (s, "abc", 4); cout << s << endl ; strncpy (s, " kalle anka ", 20); cout << s << endl ; strncpy (s, "def", 3); cout << s << endl ; ger utskriften abc kalle anka defle anka Satserna int data [] 558646598, 65, 66; char x [16]; char t [30] " test "; strncpy (x," abcdefghijklmnop ",16); strcpy (t,x); cout << t << endl ; ger utskriften abcdefghijklmnop FEL!A Tänk på att strncpy måste ha plats till avslutande \0. strcpy kopierar tills den hittar ett \0 i src. C-strängar : Standardbibliotek för C-strängar 11. Lågnivå-detaljer 15/34 C-strängar : Standardbibliotek för C-strängar 11. Lågnivå-detaljer 16/34 Strängkopiering Varnande exempel: förklaring int data []558646598, 65, 66; char x [16]; int data[] tolkas som char[]. representation i minnet a b... p 70 69 76 33 65 0 0 0 x ( 16 bytes) data[0] data[1] I en vanlig struct (class) allokeras utrymme motsvarande summan av de ingående delarna struct DataS int nr; double v; char txt [6]; ; Alla medlemmar i en struct ligger efter varandra i minnet. Hexadecimal representation: 558646598 10 = 214c4546 16 65 10 = 41 16 Byte-ordning: little-endian hex ASCII) dec 46 F 70 45 E 69 4c L 76 21! 33 41 A 65 0 \0 0 0 \0 0 0 \0 0......... I en allokeras utrymme motsvarande maxstorleken av de ingående delarna DataU int nr; double v; char txt [6]; ; Alla medlemmar i en har samma address: bara en medlem åt gången kan användas. C-strängar : Standardbibliotek för C-strängar 11. Lågnivå-detaljer 17/34 11. Lågnivå-detaljer 18/34

Varnande exempel Exempel på användning av DataU using std :: cout ; using std :: endl ; DataU int nr; double v; char txt [6]; ; DataU a; a.nr = 57; cout << a.nr << endl ; a.v = 12.345; cout << a.v << endl ; strcpy (a.txt, " Tjo "); cout << a. txt << endl ; 57 12.345 Tjo Foo int i; float f; double d; char c [10]; ; Foo f; f.i = 12; cout << f.i << ", " << f.f << ", " << f.d << ", " << f.c << endl ; programmerarens ansvar att rätt medlem används 11. Lågnivå-detaljer 19/34 strcpy (f.c, "Hej, du"); cout << f.i << ", " << f.f << ", " << f.d << ", " << f.c << endl ; 12, 1.68156e -44, 5.92879e -323, ^L 745170248, 3.33096e-12, 1.90387e -306, Hej, du 11. Lågnivå-detaljer 20/34 kapsla en i en klass för att minska risken för fel struct Bar enum undef, i, f, d, c kind ; Foo u; ; void print ( Bar b) switch (b. kind ) case Bar ::i: cout << b.u.i << endl ; case Bar ::f: cout << b.u.f << endl ; case Bar ::d: cout << b.u.d << endl ; case Bar ::c: cout << b.u.c << endl ; default : cout << "??? " << endl ; void test_kind () Bar b ; 17??? b. kind = Bar ::i; b.u.i = 17; print (b); Bar b2 ; print (b2 ); 11. Lågnivå-detaljer 21/34 klass med anonym och access-funktioner struct FooS enum undef, k_i, k_f, k_d, k_c kind ; int i; float f; double d; char c [10]; ; FooS () : kind undef FooS ( int ii) : kind k_i,iii FooS ( float fi) : kind k_f,ffi FooS ( double di) : kind k_d,ddi FooS (const char * ci) :kind k_c strncpy (c,ci,10); int get_i () assert ( kind == k_i ); return i; float get_f () assert ( kind == k_f ); return f; double get_d () assert ( kind == k_d ); return d; char * get_c () assert (kind == k_c ); return c; FooS & operator =( int ii) kind = k_i ; i = ii; return *this ; FooS & operator =( float fi) kind = k_f ; f = fi; return *this ; FooS & operator =( double di) kind = k_d ; d = di; return *this ; FooS & operator =( const char * ci ) kind=k_c ; strncpy (c,ci,10); return * this ; ; 11. Lågnivå-detaljer 23/34 void test_struct () FooS f (17); anonym slipp en nivå Ett annat alternativ är följande: struct FooS enum undef, k_i, k_f, k_d, k_c kind ; int i; float f; double d; char c [10]; ; ; FooS test ; test.kind = FooS :: k_c; strcpy ( test.c, " Testing "); if(test.kind == FooS :: k_c) cout << test.c << endl ; Testing 11. Lågnivå-detaljer 22/34 Bit-operatorer Operationer på låg nivå: Bit-operatorer Alla variabler antas vara av typen unsigned short int vilket innebär 16 bitars positiva heltal a = 77; // a = 0000 0000 0100 1101 b = 22; // b = 0000 0000 0001 0110 c = ~a; // negera varje bit ( bitvis komplement ) d = a & b; // en bit i d = 1 om motsvarande bit i a OCH b == 1 e = a b; // en bit i e = 1 om motsvarande bit i a ELLER b == 1 f = a ^ b; // en bit i f = 1 om motsvarande bit i a XOR b == 1 g = a << 3; // skifta bitarna 3 steg vä nster h = c >> 5; // skifta bitarna 6 steg höger (se upp med signed ) i = a & 0 x000f ; // bitmask : plocka ut de fyra lä gsta bitarna i a j = a 0 xf000 ; // sätt de hö gsta fyra bitarna till 1 k = a ^ (1 < <4); // negera femte biten Vanliga operationer: set a = a (1 << 4); a = (1 << 4); clear a = a & ~(1 << 4); a &= ~(1 << 4); toggle a = a ^ (1 << 4); a ^= (1 << 4); Bitoperationer 11. Lågnivå-detaljer 24/34 cout << f. get_i () << endl ; # ifdef ERROR cout << f. get_f () << endl ; # endif f =42.42 f; cout << f. get_f () << endl ; f =42.42;

Bit-operatorer Kan användas för att spara minne Operationer på låg nivå: Bit-operatorer Alla variabler antas vara av typen unsigned short int vilket innebär 16 bitars positiva heltal a = 77; // a = 0000 0000 0100 1101 b = 22; // b = 0000 0000 0001 0110 c = ~a; // c = 1111 1111 1011 0010 d = a & b; // d = 0000 0000 0000 0100 e = a b; // e = 0000 0000 0101 1111 f = a ^ b; // f = 0000 0000 0101 1011 g = a << 3; // g = 0000 0010 0110 1000 h = c >> 5; // h = 0000 0111 1111 1101 i = a & 0 x000f ; // i = 0000 0000 0000 1101 j = a 0 xf000 ; // j = 1111 0000 0100 1101 k = a ^ (1 << 4); // k = 0000 0000 0101 1101 Ange explicit antalet bitar med var : antalbitar struct Bil // post i ett bilregister char reg_nr [6]; unsigned int arsmod : 7; unsigned int skatt_betald : 1; unsigned int besiktigad : 1; unsigned int avstalld : 1; ; Bitoperationer 11. Lågnivå-detaljer 25/34 Bitoperationer : bit-fält 11. Lågnivå-detaljer 26/34 Exempel Åtkomst av bit-fält Bil b; strncpy (b. reg_nr, " ABC123 ", 6); b. arsmod = 97; b. skatt_betald = true ; b. besiktigad = true ; b. avstalld = false ; cout << "Å rsmodell : " << b. arsmod << endl ; if (b. skatt_bet && b. besiktigad ) cout << " Bilen är OK"; Register med 16 bitar: struct Register unsigned int enable :1; unsigned int :4; unsigned int ready :1; unsigned int :2; unsigned int data :8; ; struct Register_alt bool enable :1; bool :4; bool ready :1; bool :2; unsigned int data :8; ; data ready enable Bitoperationer : bit-fält 11. Lågnivå-detaljer 27/34 Bitoperationer : bit-fält 11. Lågnivå-detaljer 28/34 Varningar std::bitset (<bitset>) kan vara användbara i speciella fall, men de är inte portabla hur de läggs ut i minnet är implementation defined kompilatorn kan lägga till utfyllnad (padding) man kan inte ta adressen till (&) en bitfält-medlem ange alltid signed eller unsigned int-fält av storlek 1 bör vara unsigned åtkomst kan bli långsammare än en vanlig struct heltalsvariabler och bitoperationer ofta ett alternativ effektiv klass för att lagra ett antal bitar kompakt snabb har praktiska funktioner test, operator[] set, reset, flip any, all, none, count omvandling till/från string, och I/O jfr std::vector<bool> std::bitset har fix storlek en std::vector kan växa men uppför sig inte riktigt som std::vector<t> Bitoperationer : bit-fält 11. Lågnivå-detaljer 29/34 Bitoperationer : <bitset> 11. Lågnivå-detaljer 30/34

bitset, exempel: Exempel: lagra 50 flaggor i 8 bytes Komma-operatorn (Orientering och varning) void test_bitop () bool status ; cout << std :: boolalpha ; unsigned long quiza = 0; quiza = 1UL << 27 ; status = quiza & (1 UL << 27) ; cout << " student 27: " ; quiza &= ~(1 UL << 27); status = quiza & (1 UL << 27); cout << " student 27: "; student 27: true student 27: false void test_bitset () bool status ; cout << std :: boolalpha ; std :: bitset <50> quizb ; quizb. set (27) ; status = quizb [27] ; cout << " student 27: "; quizb. reset (27) ; status = quizb [27]; cout << " student 27: "; student 27: true student 27: false Komma-operatorn expression1, expression2 Utvärderar först expression1, därefter expression2 uttrycket får värdet av expression2 Exempel string s; while (cin >> s, s. length () > 5) // do something Använd inte komma-operatorn! Bitoperationer : <bitset> 11. Lågnivå-detaljer 31/34 Komma-operatorn 11. Lågnivå-detaljer 32/34 Läsanvisningar Referenser till relaterade avsnitt i Lippman Inbyggda typer 2.1 Bitoperatorer 4.8 Komma-operatorn 4.10 C-strängar 3.5.4 Union 19.6 Bitfält 19.8.1 Komma-operatorn 11. Lågnivå-detaljer 33/34