Помогни ни да направим Uroci.net по - богат! Добави урок
Категории Други уроци Adobe Photoshop Adobe Illustrator Adobe Flash Adobe Fireworks DreamWeaver CSS и HTML Corel Draw Image Ready PHP SEO CMS Microsoft Windows Microsoft Word Microsoft Excel PowerPoint Microsoft Access Microsoft Publisher Linux Visual basic JavaScript Ajax 3ds Max Maya 3D C++
C++
Sound Forge Gimp SWiSH

C++ част.3 (Изрази и оператори)

C++ » C++
fix3d   трудност:    видян: 7550



3.6. Операторът sizeof

Операторът sizeof връща размера в байтове на израз или типов спецификатор. Той може да бъде използуван в една от следните две форми:

sizeof (type-specifier);
sizeof expr;

Ето пример за използуването на двете форми:

int ia[] = { 0, 1, 2 };
const sz = sizeof ( ia ) / sizeof ( int );

Следващата програма илюстрира използуването на оператора sizeof за голямо разнообразие от типови спецификатори.

#include <stream.h>
#include "IntStack.h"
main() {
cout << "int :tt" << sizeof( int );
cout << "nint* :tt" << sizeof( int* );
cout << "nint& :tt" << sizeof( int& );
cout << "nint[3] :t" << sizeof( int[3] );
cout << "nn"; // ot separate output
cout << "Intstack :t" << sizeof( IntStack );
cout << "nIntstack* :t" << sizeof( IntStack* );
cout << "nIntstack& :t" << sizeof( IntStack& );
cout << "nIntstack[3] :t" << sizeof(IntStack[3]);

Когато тази програма бъде компилирана и изпълнена на подходяща машина, тя дава следния резултат:

int : 4
int* : 4
int& : 4
int[3] : 12

IntStack : 12
IntStack* : 4
IntStack& : 4
IntStack[3] : 36



3.7. Аритметичен оператор if

Аритметичният оператор if е един триместен (тернарен) оператор, който има следния синтаксис:

expr1 ? expr2 : expr3;

expr1 винаги се изчислява. Ако стойността му е истина - т.е. някаква ненулева стойност - се изчислява expr2; иначе - expr3. Следната програма илюстрира как може да бъде използуван аритметичния оператор if.

#include <stream.h>
main() {
int i = 10, j = 20, k = 30;
cout << "nThe Larger value of " << i << " and " << j << " is " << ( i > j ? i : j );
cout << "nThe value of " << i << " is" << ( i % 2 ? " " : " not " ) << "odd";
// the arithmetic if can be nested, bit
// too deep a nesting will be difficult to read
// max is set to the largest of 3 variables

int max = ( ( i>j )
? ( ( i>k ) ? i : k )
: ( ( j>k ) ? j : k ) );
cout << "nThe larger value of " << i << ", " << j << " and " << k << " is " << max << "n"; }

Когато тази програма се компилира и изпълни тя дава следния резултат:

The larger value of 10 and 20 is 20
The value of 10 is not odd
The larger value of 10, 20 and 30 is 30


3.8. Оператори за работа с битове

Тези оператори разглеждат операндите си като подредена съвкупност от битове. Всеки бит може да има стойност 0 (off) или 1 (on). Операторите за работа с битове позволяват на програмиста да проверява и инициализира индивидуални битове или битови подмножества.

Операндите на тези оператори трябва да бъдат от тип integer. Въпреки че те могат да бъдат със или без знак препоръчва се използването на операнди без знак. Как точно се обработва знаковия бит при тези оператори зависи от реализацията им; програми, които работят с дадена реализация може да не работят с друга. По такъв начин използуването на операнд без знак подпомага осигуряването на мобилност на програмата.

Първо ние ще обясним как работи всеки оператор. После ще дадем примери за използуване на всеки от операторите за работа с битове. В раздел 6.4 ще реализираме класа BitVector.

Оператори за работа с битове

~ поразредно логическо допълване до 1
~expr1

<< изместване в ляво
expr1 << expr2

>> изместване в дясно
expr1 >> expr2

& поразредно логическо И
expr1 & expr2

| поразредно логическо ИЛИ
expr1 | expr2


Операторът (“~”) обръща битовете на операнда си. Всеки бит със стойност 1 става 0 и всеки нулев бит получава стойност 1.

unsigned char bits = 0227;
1 0 0 1 0 1 1 1

bits = ~bits;
0 1 1 0 1 0 0 0

Операторите (“<< , >>”) изместват битовете на левия операнд с някакъв брой позиции в ляво или в дясно.

unsigned char bits = 1;
0 0 0 0 0 0 0 1

bits = bits << 1;
0 0 0 0 0 0 1 0

bits = bits << 2;
0 0 0 0 1 0 0 0

bits = bits >> 3;
0 0 0 0 0 0 0 1

Излишните битове на операндите се отстраняват. Операторът за изместване в ляво (“<<”) вмъква битове със стойност 0 от дясно. Операторът за изместване в дясно (“>>”) вмъква битове 76. със стойност 0 от ляво. Ако операндът има знак то може да се добавят копия на знаковия бит или нулеви битове; това зависи от машината.

Операторът AND ("&") работи с два операнда. Резултатът за всяка битова позиция е 1 ако двата операнда съдържат битове със стойност 1; иначе резултатът е нулев бит. (Този оператор не трябва да бъде бъркан с логическия оператор AND ("&&").

unsigned char result:

unsigned char b1 = 0145;
0 1 1 0 0 1 0 1

unsigned char b2 = 0257;
1 0 1 0 1 1 1 1

result = b1 & b2;
0 0 1 0 0 1 0 1

Операторът XOR (изключващо или) (“^”) работи с два операнда. Резултатът за всяка битова позиция е 1 ако един от двата, но не и двата операнда съдържат битове със стойност 1; иначе резултатът е нулев бит.

result = b1 ^ b2;
1 1 0 0 1 0 1 0

Операторът OR (“|”) работи с два операнда. Резултатът за всяка битова позиция е 1 ако един от двата или двата операнда съдържат битове със стойност 1; иначе резултатът е нулев бит.

result = b1 | b2;
1 1 1 0 1 1 1 1

Променлива, използувана като дискретна съвкупност от битове се нарича битов вектор. Битовият вектор е едно ефективно средство за съхраняване на да/не информация за набор от елементи и условия.

Ето един пример. Нека учител има 30 студента в даден клас.

Всяка седмици на класа се дава изпит от типа взет/невзет. Може да бъде използуван битов вектор за записване на резултатите от всеки изпит.

unsigned int quiz1 = 0; Учителят трябва да може да записва във всеки бит 0 или 1, както и да проверява съдържанието му. Например, студентът с номер 27 си е взел изпита и преминава. Учителят трябва да запише 1 в съответния бит. Първата стъпка е да запише в 27-я бит 1 като останалите битове запазят стойността си. Това може да бъде направено чрез оператора за изместване в ляво (“<<”) и цялата константа 1.

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 << 27
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

Ако тази стойност се използува като операнд за OR заедно с quiz1 всички битове освен 27-я ще останат непроменени. А 27-я ще получи стойност 1:

quiz1 |= 1<<27;

Представете си, че учителят повтори изпитването и установи, че студент 27 не се справя задоволително. Той трябва да може да запише отново 0 в бит 27. Този път цялото число трябва да има във всички битове стойност 1 с изключение на 27-я. Забележете, че това число е инверсно на числото от предния пример. Така, че може да бъде използуван оператора NOT:

1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 ~(1 << 27)
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1

Ако тази стойност се използува като операнд за AND заедно с quiz1 всички битове освен 27-я ще останат непроменени. А 27-я ще получи стойност 0:

quiz1 &= ~(1 << 27);

Ето как учителят би могъл да провери стойността на различните битове. Да разгледаме пак студент 27. Първата стъпка е да се запише в 27-я бит на едно цяло число 1. Като се приложи оператора AND над това число и quiz1 ще получим истина ако бит 27 на quiz е също 1; иначе ще бъде върната 0 (лъжа).

int hasPassed = quiz1 & (1 << 27);

Упражнение 3-4. Дадени са следните две дефиниции:

unsigned int ui1 = 3;

i2 = 7; Какъв е резултата на изразите:

(a) ui1 & ui2 (c) ui1 | ui2
(b) ui1 && ui2 (d) ui1 || ui2

Упражнение 3-5. Какво означава присвояването на 0377 на променлива от тип unsigned char в термините на битовия й шаблон? Начертайте картинката.

Упражнение 3-6. Как програмистът може да изолира втория байт на променлива от тип int използувайки операторите за работа с битове?

Упражнение 3-8. Съществува метод за получаване на степените на двойката като се използува оператора за изместване в ляво и константата 1. Генерирайте таблица от първите 16 стойности.



Страници: «1 2 3 4 5 6 7 »

Регистрирайте се, за да добавите коментар

реклама

© Всички права запазени. 2006-2008. Created by: Site.bg
Препоръчваме: IT Новини | Кино и игри | Диплома.бг | Paparak.bg | Тунинг Портал | uchenik.com | TRAVEL туризъм | Реферати | AmAm.bg | Иде.ли | Курсови работи | AnimeS-bg.com | Фото Форум | Запознанства | Мрежа от приятели | IT Light | Spodeli.net | Фото-Култ | IDG.BG | Teenproblem.net | Блог - Образование | Fresh-BG.com | Hanovete.com | Bulfleet.com | Mythlands.com | Ohoboho.com | Казанлък.Com | News24 | Setcom.bg | Atol.bg | Elmaz.com | MobileBulgaria.com