Serwis Edukacyjny
Nauczycieli

w I-LO w Tarnowie
Do strony głównej I LO w Tarnowie

  Wyjście       Spis treści       Wstecz       Dalej  

Autor artykułu: mgr Jerzy Wałaszek

©2026 mgr Jerzy Wałaszek

Pojęcie bitu

Algebra Boole'a

SPIS TREŚCI
Podrozdziały

Podstawy algebry Boole'a

George Boole
George Boole (ur. 2 XI 1815 r., zm. 8 XII 1864 r.) był matematykiem angielskim, którego uważa się za jednego z twórców dzisiejszej technologii komputerowej. Najważniejszym wynalazkiem Boole'a było opracowanie zasad wykonywania operacji logicznych – w ten sposób powstała tzw. Algebra Boole'a. Przed Boole'm logika była dziedziną zagmatwaną i trudną w zastosowaniach. Po nim stała się łatwa i przejrzysta.

W Algebrze Boole'a mamy do czynienia z danymi binarnymi. Dana może przyjąć tylko jedną z dwóch możliwych wartości:

prawda  – \(\text{true}\)  – \(1\)
fałsz  – \(\text{false}\)  – \(0\)

Z tego powodu danymi mogą być bity. Nad danymi można wykonywać operacje logiczne (podobnie jak w zwykłej algebrze nad liczbami można wykonywać operacje arytmetyczne). Podstawowych operacji logicznych mamy dokładnie trzy:

Nazwa operacji logicznej Notacja
w
logice
w
C++
w technice
cyfrowej
Negacja / zaprzeczenie / NIE / NOT \(\neg a\) !a \(\overline{a}\)
Alternatywa / suma logiczna / LUB / OR \(a\lor b\) a || b \(a+b\)
Koniunkcja / iloczyn logiczny / I / AND \(a\wedge b\) a && b \(a\cdot b\)

W powyższej tabelce zebraliśmy również różne sposoby zapisu operacji logicznych. W tym rozdziale będziemy się posługiwali oznaczeniami stosowanymi w logice. Jednakże w dalszych rozdziałach wykorzystamy również notację dla języka C++ oraz notację dla techniki cyfrowej przy projektowaniu sieci logicznych.


Negacja – zaprzeczenie – NIE – NOT

Jest to operacja jednoargumentowa. Wynikiem negacji jest wartość odwrotna, przeciwna do wartości argumentu. Zatem jeśli argument miał wartość \(0\), to negacja daje w wyniku \(1\) i na odwrót – z \(1\) otrzymujemy \(0\). Wartości funkcji logicznych w zależności od ich argumentów podaje się zwykle w tabelkach. My też skorzystamy z tego prostego sposobu:

 \(a\)   \(\neg a\)
\(0\) \(1\)
\(1\) \(0\)

Alternatywa – suma logiczna – LUB – OR

Alternatywa jest operacją dwuargumentową. Wynikiem jest \(1\)  (\(\text{true}\), prawda), jeśli chociaż jeden z argumentów ma wartość \(1\). Jeśli oba argumenty mają wartość \(0\), alternatywa też ma wartość \(0\).

 \(a\)   \(b\)  \(a\lor b\)
\(0\) \(0\) \(0\)
\(0\) \(1\) \(1\)
\(1\) \(0\) \(1\)
\(1\) \(1\) \(1\)

Operację tą często nazywa się sumą logiczną ze względu na jej podobieństwo do sumy arytmetycznej dla liczb naturalnych: suma dwóch liczb jest różna od zera, gdy chociaż jedna z tych liczb jest różna od zera, a równa zero, gdy obie liczby są równe zero.


Koniunkcja – iloczyn logiczny – I – AND

Koniunkcja jest również operacją dwuargumentową. Wynikiem jest \(1\), jeśli oba argumenty są równe \(1\). W pozostałych przypadkach wynikiem jest \(0\).

 \(a\)   \(b\)  \(a\wedge b\)
\(0\) \(0\) \(0\)
\(0\) \(1\) \(0\)
\(1\) \(0\) \(0\)
\(1\) \(1\) \(1\)

Ze względu na podobieństwo do operacji mnożenia arytmetycznego koniunkcję często nazywa się iloczynem logicznym.


do podrozdziału  do strony 

Prawa algebry Boole'a

Łączność (ang. associativity)

\({a\lor(b\lor c)=(a\lor b)\lor c}\)

oraz

\({a\wedge(b\wedge c)=(a\wedge b)\wedge c}\)
 

W celu udowodnienia tej własności posłużymy się tabelką prawdy. W tabelce najpierw obliczamy wartość lewego wyrażenia, a następnie prawego. Jeśli kolumny wyniku dla lewego i prawego wyrażenia są identyczne, własność zostaje udowodniona.

\({a\lor(b\lor c)=(a\lor b)\lor c}\)
 \(a\)   \(b\)   \(c\)  \({b\lor c}\) \({a\lor (b\lor c)}\)  \(a\)   \(b\)   \(c\)  \({a\lor b}\) \({(a\lor b)\lor c}\)
\(0\) \(0\) \(0\) \(0\) \(0\) \(0\) \(0\) \(0\) \(0\) \(0\)
\(0\) \(0\) \(1\) \(1\) \(1\) \(0\) \(0\) \(1\) \(0\) \(1\)
\(0\) \(1\) \(0\) \(1\) \(1\) \(0\) \(1\) \(0\) \(1\) \(1\)
\(0\) \(1\) \(1\) \(1\) \(1\) \(0\) \(1\) \(1\) \(1\) \(1\)
\(1\) \(0\) \(0\) \(0\) \(1\) \(1\) \(0\) \(0\) \(1\) \(1\)
\(1\) \(0\) \(1\) \(1\) \(1\) \(1\) \(0\) \(1\) \(1\) \(1\)
\(1\) \(1\) \(0\) \(1\) \(1\) \(1\) \(1\) \(0\) \(1\) \(1\)
\(1\) \(1\) \(1\) \(1\) \(1\) \(1\) \(1\) \(1\) \(1\) \(1\)
\({a\wedge(b\wedge c)=(a\wedge b)\wedge c}\)
 \(a\)   \(b\)   \(c\)  \({b\wedge c}\) \({a\wedge(b\wedge c)}\)  \(a\)   \(b\)   \(c\)  \({a\wedge b}\) \({(a\wedge b)\wedge c}\)
\(0\) \(0\) \(0\) \(0\) \(0\) \(0\) \(0\) \(0\) \(0\) \(0\)
\(0\) \(0\) \(1\) \(0\) \(0\) \(0\) \(0\) \(1\) \(0\) \(0\)
\(0\) \(1\) \(0\) \(0\) \(0\) \(0\) \(1\) \(0\) \(0\) \(0\)
\(0\) \(1\) \(1\) \(1\) \(0\) \(0\) \(1\) \(1\) \(0\) \(0\)
\(1\) \(0\) \(0\) \(0\) \(0\) \(1\) \(0\) \(0\) \(0\) \(0\)
\(1\) \(0\) \(1\) \(0\) \(0\) \(1\) \(0\) \(1\) \(0\) \(0\)
\(1\) \(1\) \(0\) \(0\) \(0\) \(1\) \(1\) \(0\) \(1\) \(0\)
\(1\) \(1\) \(1\) \(1\) \(1\) \(1\) \(1\) \(1\) \(1\) \(1\)

Przemienność (ang. commutativity)

\({a\lor b=b\lor a}\)

oraz

\({a\wedge b=b\wedge a}\)

Rozdzielność (ang. distributivity)

\({a\lor(b\lor c)=(a\lor b)\lor(a\lor c)}\)

oraz

\({a\wedge(b\wedge c)=(a\wedge b)\wedge(a\wedge c)}\)

Odwrotność (ang. complement)

\({a\lor\neg a=1}\)

oraz

\({a\wedge\neg a=0}\)

Prawa pochodne

Z podanych powyżej praw podstawowych algebry Boole'a oraz własności operacji logicznych wynikają następujące prawa pochodne:

\({a\lor a=a,\;a\wedge a=a}\)
\({a\lor0=a,\;a\wedge1=a}\)
\({a\lor1=1,\;a\wedge0=0}\)
\({\neg0=1,\;\neg1=0}\)
\({\neg(\neg a)=a}\)

Różnica symetryczna, suma modulo dwa

W logice bardzo często wykorzystuje się złożoną operację logiczną o nazwie różnicy symetrycznej lub sumy modulo dwa (ang. exclusive or). Wzór logiczny tej operacji jest następujący:

\({a\oplus b=(\neg a\wedge b)\lor (a\wedge\neg b)}\)

Chociaż nie jest on specjalnie oczywisty, to operacja różnicy symetrycznej ma bardzo prostą tabelkę stanów:

\(a\) \(b\) \({a\oplus b}\)
\(0\) \(0\) \(0\)
\(0\) \(1\) \(1\)
\(1\) \(0\) \(1\)
\(1\) \(1\) \(0\)

Wynikiem jest \(1\), jeśli argumenty operacji się różnią od siebie, a \(0\), jeśli są takie same.


do podrozdziału  do strony 

Prawa De Morgana

August De Morgan

August De Morgan (ur. 27 VI 1806 r., zm. 18 III 1871 r.) był urodzonym w Indiach angielskim matematykiem i logikiem. Wkładem De Morgana do rozwoju matematyki i logiki są prawa odnoszące się do negacji koniunkcji i negacji alternatywy. Prawa te brzmią następująco:

\({\neg(a\lor b)=\neg a\wedge\neg b}\)
Negacja alternatywy jest równa koniunkcji negacji.
\({\neg(a\wedge b)=\neg a\lor\neg b}\)
Negacja koniunkcji jest równa alternatywie negacji.

Z praw De Morgana wynikają bardzo poważne konsekwencje dla logiki. Okazuje się bowiem, iż do wykonania dowolnej operacji logicznej wystarczy para (negacja, koniunkcja) lub para (negacja, alternatywa). Ma to olbrzymi wpływ na współczesną technikę cyfrową, o czym możesz się prosto przekonać czytając dalsze artykuły. Prawa De Morgana w prosty sposób udowadniamy przy pomocy tabelek prawdy.

\({\neg(a\lor b)=\neg a\wedge\neg b}\)
\(a\) \(b\) \({a\lor b}\) \({\neg(a\lor b)}\) \(a\) \(b\) \({\neg a}\) \({\neg b}\) \({\neg a\wedge\neg b}\)
\(0\) \(0\) \(0\) \(1\) \(0\) \(0\) \(1\) \(1\) \(1\)
\(0\) \(1\) \(1\) \(0\) \(0\) \(1\) \(1\) \(0\) \(0\)
\(1\) \(0\) \(1\) \(0\) \(1\) \(0\) \(0\) \(1\) \(0\)
\(1\) \(1\) \(1\) \(0\) \(1\) \(1\) \(0\) \(0\) \(0\)
\({\neg(a\wedge b)=\neg a\lor\neg b}\)
\(a\) \(b\) \({a\wedge b}\) \({\neg(a\wedge b)}\) \(a\) \(b\) \({\neg a}\) \({\neg b}\) \({\neg a\lor\neg b}\)
\(0\) \(0\) \(0\) \(1\) \(0\) \(0\) \(1\) \(1\) \(1\)
\(0\) \(1\) \(0\) \(1\) \(0\) \(1\) \(1\) \(0\) \(1\)
\(1\) \(0\) \(0\) \(1\) \(1\) \(0\) \(0\) \(1\) \(1\)
\(1\) \(1\) \(1\) \(0\) \(1\) \(1\) \(0\) \(0\) \(0\)

Teraz pokażemy, jak wykorzystując prawa De Morgana, można zastąpić koniunkcję alternatywą i alternatywę koniunkcją.

\({a\wedge b=\neg(\neg(a\wedge b)) = \neg(\neg a\lor\neg b)}\)
\({a\lor b=\neg(\neg(a\lor b))=\neg(\neg a\wedge\neg b)}\)

W ramach ćwiczeń udowodnij tabelkami prawdy poprawność otrzymanych wyników.

Jeśli w dowolnym wyrażeniu logicznym zastąpimy wszystkie koniunkcje negacjami i alternatywą, to wyrażenie będzie zawierało tylko dwa działania logiczne – alternatywę i negację. Wynika stąd, iż te dwa działania wystarczą do zapisania dowolnego wyrażenia logicznego. Zachodzi również sytuacja odwrotna. Zastąpienie alternatywy negacjami i koniunkcją ruguje alternatywy z wyrażenia. Zatem dowolne wyrażenie logiczne można zapisać tylko przy pomocy negacji i koniunkcji.


do podrozdziału  do strony 

Operacje bitowe

Wszystkie operacje logiczne mogą być wykonywane na słówkach bitowych. W takim przypadku w operacji uczestniczą poszczególne bity na odpowiadających sobie pozycjach w obu słowach. Oto odpowiednie przykłady:

Negacja

\(\neg\;\) \(1100\)
  \(0011\)
\(\neg\;\) \(0101\)
  \(1010\)

Alternatywa

  \(1010\)
\(\lor\;\) \(1100\)
  \(1110\)
  \(0011\)
\(\lor\;\) \(1100\)
  \(1111\)
  \(1101\)
\(\lor\;\) \(1011\)
  \(1111\)

Koniunkcja

  \(1010\)
\(\wedge\;\) \(1100\)
  \(1000\)
  \(0011\)
\(\wedge\;\) \(1100\)
  \(0000\)
  \(1101\)
\(\wedge\;\) \(1011\)
  \(1001\)

Różnica symetryczna / Suma modulo 2

  1 0 1 0
\(\oplus\;\) 1 1 0 0
  0 1 1 0
  0 0 1 1
\(\oplus\;\) 1 1 0 0
  1 1 1 1
  1 1 0 1
\(\oplus\;\) 1 0 1 1
  0 1 1 0

Zerowanie bitu

Jeśli w słowie binarnym chcemy wyzerować bit (bity) na pozycji \({i{-}\text{tej}}\), to wykonujemy operację koniunkcji z maską, której wszystkie bity są ustawione na \(1\) za wyjątkiem bitu na pozycji \({i{-}\text{tej}}\).

  \(101011000011{\class{t}1}110\)
\(\wedge\;\) \(111111111111{\class{t}0}111\)
  \(101011000011{\class{t}0}110\)

Ustawianie bitu

Jeśli w słowie binarnym chcemy ustawić \({i{-}\text{ty}}\) bit na \(1\), to wykonujemy operację alternatywy z maską, której wszystkie bity są wyzerowane za wyjątkiem bitu na pozycji \({i{-}\text{tej}}\).

  \(1010110{\class{t}0}00111110\)
\(\lor\;\) \(0000000{\class{t}1}00000000\)
  \(1010110{\class{t}1}00111110\)

Negacja bitu

Jeśli chcemy zmienić stan \({i{-}\text{tego}}\) bitu na przeciwny, wykonujemy operację sumy symetryczne z maską, której wszystkie bity są wyzerowane za wyjątkiem bitu na pozycji \({i{-}\text{tej}}\)

  \(1010110{\class{t}0}00111110\)
\(\oplus\;\) \(0000000{\class{t}1}00000000\)
  \(1010110{\class{t}1}00111110\)
  \(10101100001{\class{t}1}1110\)
\(\oplus\;\) \(00000000000{\class{t}1}0000\)
  \(10101100001{\class{t}0}1110\)

Sprawdzanie stanu bitu

Jeśli chcemy sprawdzić, jaki stan ma bit na pozycji i-tej, to wykonujemy operację koniunkcji z maską, której wszystkie bity są wyzerowane za wyjątkiem bitu na pozycji i-tej. Jeśli wynik jest różny od 0, to bit i-ty miał stan 1. W przeciwnym wypadku bit i-ty miał stan 0.

  \(1010110{\class{t}0}00111110\)
\(\wedge\;\) \(0000000{\class{t}1}00000000\)
  \(0000000{\class{t}0}00000000\)
  \(10101100001{\class{t}1}1110\)
\(\wedge\;\) \(00000000000{\class{t}1}0000\)
  \(00000000000{\class{t}1}0000\)

Poniższy program wykorzystuje sprawdzanie stanu bitu do szybkiej konwersji liczby dziesiętnej na binarną – właściwie wykorzystuje on fakt, iż komputer wewnętrznie przechowuje liczby w postaci binarnej, zatem konwersja została już wykonana przy zapisie odczytanej wartości do pamięci.

C++
// Liczba binarna
// (C)2026 J.W.

#include <iostream>
// Lokalizacja
#include <clocale>
// Wymagane dla funkcji _getch()
#include <conio.h>

using namespace std;

int main()
{
  // Liczba do konwersji
  unsigned long long n;
  // Maska bitowa do testowania
  // stanu bitów liczby n
  unsigned long long m;

  // Ustawiamy lokalizację na
  // domyślną dla systemu
  // użytkownika
  setlocale(LC_ALL, "");

  cout <<
  "Przeliczanie liczby "
  "dziesiętnej na binarną\n"
  "--------------------"
  "----------------------\n\n"
  "liczba = ";

  // Odczytujemy liczbę
  // do konwersji
  cin >> n;

  cout << endl;

  // W pętli przeglądamy kolejne
  // bity liczby od najstarszego
  // do najmłodszego i wypisujemy
  // ich stan w oknie konsoli
  for(m = 0x8000000000000000ull;
      m;
      m >>= 1)
    cout << ((n & m) ? "1" : "0");

  cout << "\n\nNaciśnij Enter...";
  _getch();
  cout << endl;
  return 0;
}

Uwaga: W języku Python liczby całkowite nie mają ograniczenia zakresu i mogą przyjmować dowolną wielkość (standardowo do 4300 cyfr – jako zabezpieczenie przed atakami hackerskimi, ale limit ten możesz łatwo zmienić poleceniem sys.set_int_max_str_digits(nowy_limit), poszukaj informacji w Google.). Tutaj liczbę sztucznie ograniczamy do 64 bitów. Dlatego nie wprowadzaj wartości wykraczających poza \({2^{64}-1}\), czyli od \(0\) do \({18{'}446{'}744{'}073{'}709{'}551{'}615}\).

Python
# Liczba binarna
# (C)2026 J.W.

# Program główny

print("Przeliczanie liczby "
      "dziesiętnej na binarną\n"
      "--------------------"
      "----------------------\n")

# Odczytujemy liczbę
# do konwersji
n = int(input("liczba = "))

print()

# ograniczamy liczbę
#do 64 bitów
n &= 0xFFFFFFFFFFFFFFFF

# W pętli przeglądamy kolejne
# bity liczby od najstarszego
# do najmłodszego i wypisujemy
# ich stan w terminalu
m = 0x8000000000000000

while m:
    if n & m:
        print(1,end="")
    else:
        print(0,end="")
    m >>= 1

print()
print()

input("Naciśnij Enter...")
Wynik:
Przeliczanie liczby dziesiętnej na binarną
------------------------------------------

liczba = 1234567890123456789

0001000100100010000100001111010001111101111010011000000100010101

Naciśnij Enter...

do podrozdziału  do strony 

Zespół Przedmiotowy
Chemii-Fizyki-Informatyki

w I Liceum Ogólnokształcącym
im. Kazimierza Brodzińskiego
w Tarnowie
ul. Piłsudskiego 4
©2026 mgr Jerzy Wałaszek

Materiały tylko do użytku dydaktycznego. Ich kopiowanie i powielanie jest dozwolone pod warunkiem podania źródła oraz niepobierania za to pieniędzy.
Pytania proszę przesyłać na adres email: i-lo@eduinf.waw.pl
Serwis wykorzystuje pliki cookies. Jeśli nie chcesz ich otrzymywać, zablokuj je w swojej przeglądarce.
Informacje dodatkowe.