fbpx

Operacje bitowe w C#

Opublikowane przez Jerzy Wickowski w dniu

Algebra Boola jest jednym z podstawowych założeń znanej nam informatyki. Przy jej użyciu komputery robią to, co robią. Spora część tych operacji jest ukryta na bardzo niskim poziomie abstrakcji. Zazwyczaj nie potrzebuejmy wiedzieć, jak sobie dany procesor radzi z dodawaniem, mnożeniem, czy potęgowaniem. Czasem te operacje musimy wykonywać samodzielnie. W jaki sposób? Już piszę.

 

Operacje bitowe w C#

Nie będę dziś przedstawiał, w jaki sposób liczby są reprezentowane bitowo, czy w jaki je liczyć. Przedstawię natomiast jak manipulować wartościami bitowymi. Działające przykłady w postaci testów jednostkowych są dostępne na githubie.

 

Bitowe OR

Do tego celu służy operator pojedynczej pałki „|”. Daje on w wyniku jedynkę, gdy jedna lub druga strona są jedynkami.
`1000 0000 | 0000 1111  = 1000 1111`

 

Bitowe AND

Tutaj rolę operatora pełni ampersand „&”. Daje on w wyniku jedynkę, gdy obie strony są jedynkami.
`1111 1000 & 0001 1111  = 0001 1000 `
 

Bitowa negacja

Operator zwany tyldą „~” zamienia zera na jedynki i odwrotnie.
`~1110 0000 = 0001 1111 `

 

Przesunięcie bitowe w lewo

W tym celu używamy dwóch znaków mniejsze `<<` oraz liczby określającej o ile przesunąć. `0001 1000 << 2 = 0110 0000 `

 
Przy czym należy miej na uwadze, że gdy bity wyjadą poza zakres to zostaną zastąpione zerami.
`1100 0000  <<1 = 1000 0000 `

 

Przesunięcie bitowe w prawo

Sytuacja wygląda jak wyżej, ale używamy dwóch znaków większe `>>`.
`0001 1000 >> 3 =  0000 0011 `

 

Praktyka

Wszystko świetnie, ale po co, po co, po co? Zapytasz, cytując Kaję. Opisuję i objaśniam. Jakiś czas temu potrzebowałem usunąć właściwość ReadOnly z pliku na platformie Windows Compact. Była ona reprezentowana jako wartość flagowa. Szybko doszedłem do wniosku, że muszę użyć logicznego AND z odwróconą wartością flagi FileAttributes.ReadOnly. Jak to zrobić? O tak:
 

public class ReadOnlyFlagRemover
{
    public void RemoveReadOnlyFlag(string path)
    {
        var fileInfo = new FileInfo(path);
        var attributes = fileInfo.Attributes;
        attributes = attributes & ~FileAttributes.ReadOnly;
        fileInfo.Attributes = attributes;
    }
}

 

Zakończenie

Jak widzisz operacje bitowe nie są skomplikowane. Wymagają jednak pewnego obycia. Mówiąc szczerze naprawdę rzadko mam z nimi do czynienia. A jak sytuacja wygląda u Ciebie? Czy potrafisz podać jakiś przykład, kiedy ostatnio manipulowałeś bitami?



Czy to był wartościowy artykuł? Zapisz się, a wyślę Ci dwa ebooki o czystym kodzie oraz będę informował Cię o nowych postach
Kategorie: Code

0 Komentarzy

Dodaj komentarz

Twój adres email nie zostanie opublikowany.

Witryna wykorzystuje Akismet, aby ograniczyć spam. Dowiedz się więcej jak przetwarzane są dane komentarzy.


    Zapisz się

    Wyślę Ci dwa dokumenty mówiące o jakości kodu. Dodatkowo będę Cię informował o nowych postach i nowościach.