{
  "version": "https://jsonfeed.org/version/1",
  "title": "gruszka.dev",
  "home_page_url": "https://gruszka.dev",
  "feed_url": "https://gruszka.dev/tag-code.json",
  "description": "Things I would like to share",
  "items": [
    {
      "id": "https://gruszka.dev/operacje-bitowe.html",
      "url": "https://gruszka.dev/operacje-bitowe.html",
      "title": "Operacje bitowe",
      "content_html": "<p>Operacje bitowe są wygodną formą manipulowania danymi.</p>\n<p>Wyobraź sobie, że jesteś programistą i masz za zadanie napisac ważny element systemu operacyjnego. Powiedziano Ci, że możesz używać zmiennej przypisanej w następujący sposób:</p>\n<pre class=\"marmite-code\"><code class=\"marmite-code-inner language-python\"><a-v>flagRegister</a-v> <a-o>=</a-o> <a-n>0x1234</a-n></code></pre>\n<p>Zmienna przechowuje informacje o różnych aspektach działania systemu. Każdy bit zmiennej przechowuje jedną wartość 0 / 1. Powiedziano Ci również, że tylko jeden z tych bitów należy do Ciebie - trzeci (bity są ponumerowane od zera; bit numer zero jest najniższy, a najwyższy to 31). Pozostałe bity nie mogą się zmieniać, ponieważ są przeznaczone do przechowywania innych danych. Oto twój bit oznaczony literą x →</p>\n<p><code>flagRegister: 0000000000000000000000000000x000</code></p>\n<p>Oto co możesz zrobic wykorzystując operacje bitowe:</p>\n<ul>\n<li>\n<p>sprawdź stan swojego bitu - chcesz poznać wartość swojego bitu; możesz użyć następującej właściwości koniunkcji:</p>\n<p><code>x &amp; 1 = x</code></p>\n<p><code>x &amp; 0 = 0</code></p>\n<p>Jeśli zastosujesz operację &amp; do zmiennej <code>flagRegister</code> wraz z następującym obrazem bitowym:\n<code>0000000000000000000000000000001000</code>\n(zwróć uwagę na 1 na pozycji bitu, który Cię interesuje), w wyniku czego otrzymujesz jeden z następujących ciągów bitów:</p>\n<p><code>0000000000000000000000000000001000</code>, jeśli twój bit został ustawiony na 1</p>\n<p><code>0000000000000000000000000000000000</code>, jeśli twój bit został ustawiony na 0</p>\n<p>Taka sekwencja zer i jedynek, których zadaniem jest przechwycenie wartości lub zmiana wybranych bitów, nazywa się maską bitową. Zbudujmy maskę bitową, aby wykryć stan twojego bitu. Dla przypomnienia - jest to trzeci bit licząc od prawej (1000), czyli w tym przypadku 8. Odpowiednią maskę można utworzyć na podstawie następującej deklaracji:</p>\n<pre class=\"marmite-code\"><code class=\"marmite-code-inner language-python\"><a-v>mask</a-v> <a-o>=</a-o> <a-n>8</a-n></code></pre>\n<p>Możesz wykonać sekwencję instrukcji w zależności od stanu twojego bitu:</p>\n<pre class=\"marmite-code\"><code class=\"marmite-code-inner language-python\"><a-k>if</a-k> <a-v>flagRegister</a-v> <a-o>&amp;</a-o> <a-v>mask</a-v>:\n    <a-c># my bit is set</a-c>\n<a-k>else</a-k>:\n    <a-c># my bit is reset</a-c></code></pre>\n</li>\n<li>\n<p>zresetuj swój bit - przypisujesz zero do swojego bitu, podczas gdy wszystkie inne bity pozostają niezmienione; użyjmy tej samej właściwości koniunkcji, co poprzednio, ale użyjmy nieco innej maski - dokładnie tak jak poniżej:\n111111111111111111111111111111<strong>0</strong>111</p>\n<p>Zauważ, że maska została utworzona w wyniku zanegowania wszystkich bitów zmiennej <code>mask</code>. Resetowanie bitu jest proste i wygląda tak:</p>\n<pre class=\"marmite-code\"><code class=\"marmite-code-inner language-python\"><a-v>flagRegister</a-v> <a-o>=</a-o> <a-v>flagRegister</a-v> <a-o>&amp;</a-o> <a-o>~</a-o><a-v>mask</a-v></code></pre>\n<pre class=\"marmite-code\"><code class=\"marmite-code-inner language-python\"><a-v>flagRegister</a-v> <a-o>&amp;=</a-o> <a-o>~</a-o><a-v>mask</a-v></code></pre>\n</li>\n<li>\n<p>ustaw swój bit - przypisujesz 1 do swojego bitu, podczas gdy wszystkie pozostałe bity muszą pozostać niezmienione; użyj następującej właściwości rozłączenia:</p>\n<p><code>x | 1 = 1</code></p>\n<p><code>x | 0 = x</code></p>\n<p>Teraz możesz ustawić swój bit, wykonując jedną z poniższych instrukcji:</p>\n<pre class=\"marmite-code\"><code class=\"marmite-code-inner language-python\"><a-v>flagRegister</a-v> <a-o>=</a-o> <a-v>flagRegister</a-v> <a-o>|</a-o> <a-v>mask</a-v></code></pre>\n<pre class=\"marmite-code\"><code class=\"marmite-code-inner language-python\"><a-v>flagRegister</a-v> <a-o>|=</a-o> <a-v>mask</a-v></code></pre>\n</li>\n<li>\n<p>Zaneguj swój bit - zamieniasz 1 na 0, a 0 na 1. Możesz użyć interesującej właściwości operatora xor:</p>\n<p><code>x ^ 1 = ~ x</code></p>\n<p><code>x ^ 0 = x</code></p>\n<p>Zaneguj swój bit, wykonując poniższe instrukcje:</p>\n<pre class=\"marmite-code\"><code class=\"marmite-code-inner language-python\"><a-v>flagRegister</a-v> <a-o>=</a-o> <a-v>flagRegister</a-v> <a-o>^</a-o> <a-v>mask</a-v></code></pre>\n<pre class=\"marmite-code\"><code class=\"marmite-code-inner language-python\"><a-v>flagRegister</a-v> <a-o>^=</a-o> <a-v>mask</a-v></code></pre>\n</li>\n</ul>\n<p>Jak widzisz operacje bitowe są proste i jednocześnie efektywne :)</p>\n",
      "summary": "",
      "date_published": "2020-06-19T00:00:00-00:00",
      "image": "",
      "authors": [
        {
          "name": "Błażej Gruszka",
          "url": "https://www.linkedin.com/in/blazejgruszka/",
          "avatar": "https://github.com/bgruszka.png"
        }
      ],
      "tags": [
        "code"
      ],
      "language": "pl"
    }
  ]
}