Побитови операции и целочислено умножение / делене

Най-бързата памет в един компютър са регистрите на процесора. Ако поне част от използваните аритметични действия в една програма са чрез побитови операции, то работата на програмата като цяло се ускорява значително. Побитови операции са реализирани в много езици за програмиране и C++ не прави изключение.

   Разгледани са няколко побитови операции като:
   проверка за стойност различна от 0 - чрез оператора "!";
   превръща всеки бит от числото със стойност 0 в 1 и обратно - чрез оператора "~";
   целочислен остатък - чрез оператора "%";
   побитови логически операции AND; OR; XOR; - дадена е таблица на съответствие.
   целочислено умножение / делене на 2 - чрез операторите за изместване наляво/надясно "<<", ">>".
   Логиката на последната операция е следната: ако прибавим към двоично число 0 след неговата последна цифра, то това е равносилно на умножение на числото по 2. Респективно, ако изтрием неговата най-дясна цифра, то това е равносилно на делене на 2. Действията се отнасят само за естествени числа.
   Следващата програма дава решена задача, илюстрираща описаните действия с побитови операции:
#include<iostream>

using namespace std;

int main()

{ int a,c,d;

   char b;


    cout<<"Programa iliustrira dejstwieto na otdelni manipulatori za pobitowi operacii \n";

    cout<<"Simwolyt '!' e znak za otricanie - wrysha samo stojnosti 0 ili 1.\n";

    cout<<"Simwolyt '~' e znak za dopylnenie - obrysha znachenieto ba bitowe\n";

    cout<<"Simwolyt '%' e znak za modul.\n";

    cout<<"Premestwane nalqwo d=8<<2 e rawnostojno na proizwedenieto 8*2*2.\n";


     cout<<"Premestwane nadqsno d=128>>2 e rawnostojno na celochisleno delene (8/2)/2.\n";

 

    cout<<"Wywedete chislo [122..222]: ";cin>>d;

     cout<<"S kolko pozicii (razrqda) da premestq [2..7]: "; cin>>a;


  //ako a > 7 she se prehwyrli dopustimata stojnost za tipa int

     c=d<<a;//syhranqwa se wywedenata stojnost

     cout<<"Wsqko premestwane nalqwo e umnovenie po 2: "<<c<<endl;

     c=d>>a;


     cout<<"Wsqko premestwane nadqsno e delene na 2: "<<c<<endl;

    c=!d;//rezultatyt e samo 0 ili 1

     cout<<"Reulztat ot opreaciq !"<<d<<"  = "<<c<<endl;

    c=d%10;//poslednata cifra


    cout<<"Reulztat ot opreaciq "<<d<<"%10  = "<<c<<endl;

 //promenliwata b e deklarirana kato char 

     c=~d;//obrysha wseki bit, ako e 0 stawa 1, ako e 1 stawa 0

    b=(char) c;

     cout<<"Stojnostta na dopylwane e: "<<c<<", a znakyt e: "<<(char)b<<endl;


 

     cout<<"Rezultat ot dejstwie na pobitowite operacii AND '&', XOR '^', OR '|'\n";

// AB&^|   Lewite dwe koloni opiswat wyzmovnite stojnosti na promenliwite A,B

// 00000

// 10011

// 01011

// 11101


// d=8;c=4;

  

     c=d & a;//pobitowa operaciq AND - 1 samo ako i 2-ta bita sa 1

     cout<<"operaciq "<<d<<"&"<<a<<" = "<<c<<endl;  


     c=d ^ a;//pobitowa operaciq XOR - 1 samo ako 1 ot 2-ta bita e 1

     cout<<"operaciq "<<d<<"^"<<a<<" = "<<c<<endl;

     c=d | a;//pobitowa operaciq OR - 1 ako koj da e ot 2-ta bita e 1 


     cout<<"operaciq "<<d<<"|"<<a<<" = "<<c<<endl;

system ("pause");//ochakwa natiskane na klawish

return 0;

}//kraj na programa pobitowi operacii 


Изискването за променливите, участващи в побитови операции е те да са цели числа. Със следващата програма се илюстрира една от най-често срещаните грешки в програмирането - грешка при деклариране типа на променливата. Ако последователно умножаваме по 2 на положителна стойност, то след всяко поредно умножение стойността би трябвало да нараства. Тук умножението се извършва с оператора за преместване << и параметър 1, т.е. целочислено умножение по 2. И това действително се получава до достигане граничната стойност за типа променлива. Всяко следващо умножение води до напълно логичен, но странен резултат - препълване. Следващата примерна програма илюстрира грешка с една от често срещаните побитови операции - целочислено умножение по 2:

#include <iostream>

using namespace std;

int const N=20;

int main()

{short int i,a=1;


    for (i=1;i<N;i++)

    { a=a<<1;

      cout<<a<<endl;

    }

system("pause");

return 0;

} //kraj na programata  

Обяснени и решени задачи с подобни алгоритми, функции и служебни думи са разгледани в страницата с електронни уроци по информатика - програмиране.
Илюстриране работата на характерни алгоритми можете да намерите в предоставените електронни помагала съдържащи решени задачи, примери.

Начало на страницата

 
Размер на шрифта
Increase Font Size Option 3 Reset Font Size Option 3 Decrease Font Size Option 3
Bulgarian Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish
Търсене в сайта: