ТЕМА 21: Радиобутони Побитови операции

Радиобутони

Побитови операции. Операция ?

 

Побитовите операции се извършват непосредствено с битовете на своите операнди. Операндите на побитовите операции могат да бъдат само целочислени стойности. Тези операции не могат да се използват за стойности от тип bool, float или double и за обекти от класове. Побитовите операции се използват за проверка за установяване или изместване на битовите, които съставят целочислените стойности. Побитовите операции са важни за решаване на много задачи при системното програмиране. Например, когато е необходимо да се получи информация за състоянието на устройство. Побитовите операции са:

& - AND - логическо умножение / и

| - OR – логическо събиране / или

^ - XOR – събиране по модул 2 / изключващо или

>> - побитова операция за изместване надясно

<< - побитова операция за изместване наляво

~ - побитова унарна операция NOT

С помощта на побитовата операция AND могат да се анулират битове, т.е. ако някой бит в единия от операндите има стойност 0, то и съответния му бит в резултата винаги има стойност 0. Да разгледаме един пример (преобразуване на малки в главни латински букви):

using System;

class UpperCase

{

    public static void Main()

    {

        char ch;

        for (int i = 0; i < 10; i++)

        {

            ch = (char)('a' + i);

            Console.WriteLine(ch);

            ch = (char)(ch & 65503);

            Console.WriteLine(ch);

        }

    }

}

Побитовата операция & също се използва, когато е необходимо да се получи стойността на определен бит. Например, ако искаме да получим стойността на 4ти бит, трябва да имаме 00001000, пр.:

Console.WriteLine(status & 8);

Този подход се използва в следващата програма за извеждане на екрана на двоичното представяне на стойности от тип byte.

using System;

 

class showBits

{

    public static void Main()

    {

        int t;

        byte val = 123 ;

        for (t = 128; t > 0; t /= 2)

        {

            if ((val & t)!=0)

                Console.Write("1");

            else

                Console.Write("0");

        }

    }

}

Обратно на операцията &, побитовата операция | може да се използва за задаване на стойност 1 на отделен бит. Ако поне в единия от операндите е даден бит 1, то съответния бит в резултата е също 1.

Ще разгледаме програма, която преобразува главна в малка латински букви:

using System;

 

class LowerCase

{

    public static void Main()

    {

        char ch;

        for (int i = 0; i < 10; i++)

        {

            ch = (char)('A' + i);

            Console.WriteLine(ch);

            ch = (char)(ch | 32);

            Console.WriteLine(ch);

        }

    }

}

При изпълнение на ^, даден бит в резултата получава стойност 1, само когато съответните битове в операндите са различни. Операцията ^ има едно много интересно свойство, което позволява да се използва кодиране на съобщения.

R1=X^Y;

R2=R1^Y;

Сега R2 има същата стойност като Х, т.е. резултатът от последователното изпълнение на две операции ^ с използването на една и съща стойност, ще бъде първия операнд. Тази стойност се използва като ключ, или шифър, при кодирането и разкодирането на дадено съобщение.

using System;

 

class Encode

{

    public static void Main()

    {

        string msg = "Съвършено секретно! Агент Тенев";

        string encmsg = "";

        string decmsg = "";

        int key=123;

        Console.WriteLine("Първоначално съобщение: {0}", msg);

        for (int i = 0; i < msg.Length; i++)

            encmsg+=(char)(msg[i]^key);

        Console.WriteLine("Кодирано съобщение: {0}", encmsg);

        for (int i = 0; i < msg.Length; i++)

            decmsg += (char)(encmsg[i] ^ key);

        Console.WriteLine("Декодирано съобщение: {0}", decmsg);

    }

}

Унарната побитова операция ~ променя всички битове в операнда.

В С# съществува възможност битовите на целочислена стойност да се изместват наляво или надясно на зададен брой позиции. Определени са две операции: >> и <<. Те имат следния общ вид:

Операнд<<бр_битове;

Операнд>>бр_битове;

Изместване наляво води до изместване на всички битове на операнда наляво с указания бтой позиции, като освободилите се младши битове се запълват с 0, а съответния брой старши се губят. Аналогично и за изместването надясно. Ако надясно се изместват битовете на стойност без знак, то старшите се запълват с 0, а съответния брой младши се губят. Ако надясно се изместват битовете с знак, то старшите се запълват със знаковия бит. Ще разгледаме програма, която демонстрира >> и <<:

using System;

 

class ShiftThem

{

    public static void Main()

    {

        int val = 1;

        for (int i = 0; i < 8; i++)

        {

            for (int t = 128; t > 0; t /= 2)

            {

                if ((val & t) != 0)

                    Console.Write("1");

                else

                    Console.Write("0");

            }

            Console.WriteLine();

            val = val << 1;

        }

        val = 128;

        Console.WriteLine();

        for (int i = 0; i < 8; i++)

        {

            for (int t = 128; t > 0; t /= 2)

            {

                if ((val & t) != 0)

                    Console.Write("1");

                else

                    Console.Write("0");

            }

            Console.WriteLine();

            val = val >> 1;

        }

        Console.WriteLine();

    }

}

Побитовите операции могат да се използват за изпълнение на бързо умножение или деление на 2. Изместване наляво умножава по 2, а надясно – дели на 2. Резултатът ще бъде верен, ако при изместването, битовете 1 не излизат от границите на числото. Всички двуместни побитови операции могат да се използват едновременно с операцията =.

Ще разгледаме клас, който представя двоичното представяне на целочислена стойност:

using System;

class ShowBits

{

    public int numbits;

    public ShowBits(int n)

    {

        numbits = n;

    }

    public void show(ulong val)

    {

        ulong mask = 1;

        mask <<= numbits - 1;

        int spacer = 0;

        for (; mask != 0; mask >>= 1)

        {

            if ((val & mask) != 0)

                Console.Write("1");

            else

                Console.Write("0");

            spacer++;

            if (spacer % 8 == 0)

            {

                Console.Write(" ");

                spacer = 0;

            }

        }

        Console.WriteLine();

    }

}

 

class ShowBitsDemo

{

    public static void Main()

    {

        ShowBits b = new ShowBits(8);

        ShowBits i = new ShowBits(32);

        ShowBits l = new ShowBits(64);

        b.show(123);

        i.show(123456789);

        l.show(12345678987654321);

        b.show(1232456);    //taka 6te bydat pokazani samo mlad6ite 8 bita

    }

}

Операцията ? има следния общ вид:

Израз1?израз2:израз3

         Тук израз1 трябва да е от булев тип, а израз2 и израз3 трябва да имат еднакви типове. При изпълнение на операцията ? първо се пресмята израз1. Ако стойността на израз1 е true, то се пресмята израз2 и неговата стойност става резултат от изпълнението на операцията. Ако стойността на израз1 е false, то се пресмята израз3 и неговата стойност става резултат от изпълнението на операцията. Да разгледаме пример за пресмятане на абсолютна стойност:

         аbsval=val<0?-val:val;

      Същия резултат се получава с използване на оператор if:

if(val<0)

            аbsval=-val;

      else

            аbsval=val;

      Следващият пример се демонстрира използването на операция ?, за да се предотврати деление на 0:

using System;

 

class NoZeroDev

{

    public static void Main()

    {

        int result;

        for(int i=-5; i<6; i++)

        {

            result=i!=0?100/i:0;

            if(i!=0)

                Console.WriteLine("100/{0}={1}", i, result);

        }

 

    }

}

 

RadioButton

Общи понятия

Радиобутоните RadioButton/ носят името си от радиоапаратите, които дават възможност да се избере само един бутон, за да се слуша само една радиостанция. На същия принцип се избира само един радиобутон за избор само на една опция.

Радиобутоните (бутони за опции) позволяват на потребителя да избира само една опция.

 

Ако радиобутоните в една форма не са групирани в рамка, Visual C# приема, че всички радиобутони, разположени в една и съща форма, са в една и съща група. Следователно даже и да нямат нищо общо 2 радиобутона, щом са разположени в една форма, то в даден момент ще можем да изберем само един от тях.

Изчертаване и групиране на  радиобутони

Радиобутоните се отделят в групи по даден признак. За целта се използва контролата  GroupBox, Panel или TabPage. Засега ще се спрем само на GroupBox. В рамките на един контейнер може да бъде избран само един радиобутон.

При групиране на RadioButton първо се изчертава рамката, след което се изчертават радиобутоните. Групирането им в няколко рамки позволява да бъдат избрани повече радиобутони. В рамката имаме възможност за избор на само един, но при група рамки с радио бутони в една форма, могат да бъдат избрани по един от всяка рамка.

Най-напред от лентата с инструменти избираме компонента GroupBox и го изчертаваме върху формата. Свойствата му Text, Name, Font… са аналогични с тези на разгледаните досега компоненти. След като изчертам този панел в него изчертаваме необходимият ни брой радиобутони.

За да определим, кой от обектите в групата първоначално ще е избран при обхождане с Tab, трябва да зададем на свойството му TabStop=True, а на всички останали обекти от групата TabStop=False. Когато стигнем до групата с натискане на Tab, за да се придвижим между елементите на групата използваме клавишите-стрелки.

Най-често използвани свойства за радиобутони

Свойства компонента RadioButton

Свойство

Описание

Техt

Текста, който се появява в дясната част на бутона

Checked

Състояние, вънншният вид на бутона. Ако той е избран, то стойността на това свойство е True, а ако радиобутонът не е избран, то стойността на свойството Checked е равно на False

TextAllign

Разположение на текста.

CheckAlign

Определя разположението на бутона

Enabled

Позволява(True) или забранява(False) обекта

Visible

Бутонът става видим или невидим

AutoCheck

Свойството определя, дали автоматически да се изменя състоянието на бутона при кликване с мишката върху него. По подразбиране това свойство има стойност True

FlatStyle

Стил на бутона.

Обикновен (Standard), плосък (Flat) или „изплуващ” (Popup). Този стил определя поведението на бутона при позициониране на показалеца на мишката върху него.

Appearance

Определя вида на радиобутона. Той може да изглежда по обичаен начин(Normal) или като бутон (Button)

Image

Картинката, която се изобразява в полета на обекта

ImageAlign

Разположение на картинката

Основни събития

CheckedChanged – настъпва при кликване с мишката върху радиобутона. т.е. в този случай Checked=True

 

Търсене