Напредни C# туторијали со Никола Ѓоргиев: Bitwise операции

Никола Ѓоргиев е Unity Developer кој реши своето C# искуство да го сподели со сите преку YouTube туторијали.

Видеата се одлично склопени едноставни за разбирање и што е вистинска реткост, на македонски.


Во ова видео Никола Ѓоргиев ќе не запознае со bitwise операции; како со помош на логички операции може да доделиме повеке вредности на еден енумератор; и на кратко ќе се запознаеме зошто може да ни бидат потребни повеќе различни вредности за „enum“ оператор. Еве што вели Никола за ова видео во својата книга.

Во претходниот дел видовме како може да доделуваме поединечни вредности на енумераторите, но постои начин енумераторот да има повеќе од една вредност. За да го разберете ова, мора да имате малку познавање од булова алгебра (прочитајте повеќе тука).

За да го разбереме сето ова, ке направиме една енумерација, која ги листа пермисиите кој може да ги има да речеме еден фајл, што значи дека можните опции ни се None, Read, Write и All, па ќе направиме таков енумератор, и истиот ке го означиме со атрибутот [Flags], и со тоа ќе може да вршиме логички операции врз енумераторот:
[Flags]
public enum Permissions
{
None = 0,
Read = 1,
Write = 2
}

За да работиме со логички операции со енумераторите, вредностите што ке ги користиме мора да се power of two, односно 1(2^0),2(2^1),4(2^2),8(2^3),16(2^4),32(2^5),64(2^6) … None нема да ја користиме со логичките операции, па вредноста може да и ја ставиме 0.

Сега да креираме променлива од оваа енумерација, и да и ја означиме вредноста на None:

Permissions permissions = Permissions.None;

За да додадеме нова вредност на оваа променлива, го користиме “|= value” операторот, а за да отстрание вредност “&= ~value”:

Permissions permissions = Permissions.None;
Console.WriteLine(permissions);
permissions |= Permissions.Write;
Console.WriteLine(permissions);
permissions &= ~Permissions.Write;
Console.WriteLine(permissions);

Доколку го пробаме примерот во Visual Studio, при првото печатење на вредноста за permissions, ќе ни се испечати None, потоа со помош на “|= value” додаваме Write перимисија, и во наредното печатење, ќе ни се испечати Write, и на крај со помош на “&= ~value” ја отстрануваме Write перисијата.

Така на овој начин може да додадеме повеке врености на нашата енумерација, па доколку сакаме нашата променлива да прима и Read и Write, тоа би изгледало вака:

Permissions permissions = Permissions.None;
permissions |= Permissions.Read;
permissions |= Permissions.Write;

Логички операции може да користиме и во самата декларација на енумераторот, па доколку сакаме да воведеме трета променлива All, која ке ги прима вредностите Read и Write, може да го направиме следното:
[Flags]
public enum Permissions
{
None = 0,
Read = 1,
Write = 2,
All = Read | Write,
}

Доколку сакаме да ја провериме нашата променлива дали содржи некоја вредност, може да ја повикаме методата HasFlag(value):

if (permissions.HasFlag(Permissions.Read))
{

}

Па така може да направиме една метода, која ке ни ги проверува вредностите за нашиот енумератор:
static Permissions CheckPermissions(Permissions permissions)
{
Permissions temp = Permissions.None;
if (permissions.HasFlag(Permissions.Read))
{
temp |= Permissions.Read;
}

if (permissions.HasFlag(Permissions.Write))
{
temp |= Permissions.Write;
}

if (permissions.HasFlag(Permissions.All))
{
temp |= Permissions.All;
}
Console.WriteLine(temp);
return temp;
}
Прочитајте повеке на линкот тука.

Коментирај

Вашата адреса за е-пошта нема да биде објавена.

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

Слични статии