czwartek, 24 grudnia 2015

C - Operacje na bitach

W tym poście chciałbym zapisać sposoby wykonywania operacji na bitach.

Rodzaje operacji:


Głównym wykorzystywanym znakiem jest << lub >>. Informuje on w którą stronę dane będą przesuwane czy w stronę wyższej potęgi (<<), czy może w stronę niższej (>>).


Poniżej przedstawiam przykładowe deklaracje różnych operacji na bitach.
  • Ustawienie wybranego bitu y w słowie X. Liczenie rozpoczyna się od zera. 
    • X |= 1<<y
  • Rozwinięcie linii pokazanej powyżej. Pozwala na ustawienie różnych bitów w pojedynczym słowie.
    • X |= 1<<y | 1<<k
  • Zerowanie wybranego bitu w słowie
    • X &=~(1<<y)
  • Wyzerowanie podanych bitów odpowiednio o numerach x, z, oraz v+2
    • X &=~(1<z | 1<< y | 4<<v)
  • Zanegowanie wybranego bitu w podanym słowie.
    • X ^=1<<n
  • Zanegowanie grupy bitów w podanym słowie, odpowiednio o numerach z oraz y+1
    • X ^= 1<<z  | 2<<y 
  • Przesunięcie bitów w określoną stronę
    • X = 1<<y
  • Bądź w drugą:
    • X = 1>>y

Programy:


Poniżej przedstawiam kilka programów napisanych w języku C, zaprezentują one działanie poszczególnych operacji bitowych wymienionych wcześniej.

W pierwszym programie przedstawiłem w jaki sposób przesuwać bity w podanym słowie:

#include <stdio.h>
#include <stdlib.h>
 
int main()
{
    int a = 9;
 
    /*
     * Binarnie: 00001001
     * wypisze 9
     */
    printf ("a = %d\n", a);
 
    /*
     * Binarnie: 00100100 //wypisze 36
     * Przesunięcie zaznaczonych bitów o dwa miejsca
     * w stronę wyższej potęgi
     */
    printf ("9 << 2 = %d\n", a<<2);
 
    /*
     * Binarnie: 00000010 //wypisze 2
     * Przesunięcie zaznaczonych bitów o dwa miejsca
     * w stronę niższej potęgi liczby które znajdą się
     */
    printf ("9 >> 2 = %d\n", a>>2);
    return 0;
}

Ustawienie wybranego bitu w słowie:

#include <stdio.h>
#include <stdlib.h>
 
int main()
{
    int a = 9;
 
    /*
     * Binarnie: 00001001
     * wypisze 9
     */
    printf ("a = %d\n", a);
 
    /*
     * Ustawienie wybranego bitu w słowie, liczenie od 0
     * Ustawiony został bit 5 więc wyświetli się wartość:
     * Binarnie 00101001, 32 + 8 + 1 = 41
     */
    printf ("%d\n", a |= 1<<5);
 
    return 0;
}

Zerowanie podanego bitu w słowie:

#include <stdio.h>
#include <stdlib.h>
 
int main()
{
    int a = 9;
 
    /*
     * Binarnie: 00001001
     * wypisze 9
     */
    printf ("a = %d\n", a);
 
    /*
     * Zerowanie wybranego bitu w słowie, liczenie od 0
     * Wyzerowany został bit nr 3.
     * Binarnie: 00000001, Dziesiętnie: 1
     */
    printf ("9 << 2 = %d\n", a &=~(1<<3));
 
    return 0;
}

Wyzerowanie podanych b:

#include <stdio.h>
#include <stdlib.h>
 
int main()
{
    int a = 255;
 
    /*
     * Binarnie: 11111111
     * wypisze 9
     */
    printf ("a = %d\n", a);
 
    /*
     * Zerowanie wybranego bitu w s³owie, liczenie od 0
     * Wyzerowany zostal bit nr 6 oraz 7,
     * Ostatnie polecenie zeruje bit 2 + 1 = 3
     * Binarnie: 00110111, Dziesiêtnie: 55
     */
    printf ("= %d\n", a &=~(1<<6 | 1<<7 | 4<<1));
 
    return 0;
}

Zanegowanie wybranych bitów:

#include <stdio.h>
#include <stdlib.h>
 
int main()
{
    int a = 55;
 
    /*
     * Binarnie: 00110111
     * wypisze 9
     */
    printf ("a = %d\n", a);
 
    /*
     * Zanegowanie wybranych bitów, liczenie od 0
     * Zanegowane zostają następujące bity 7, 6, 2, 1,
     * Binarnie 11100111, Dziesiętnie: 11110001
     */
    printf ("= %d\n", a ^=1<<7 | 1<<6 | 1<<2 | 1<<1);
 
    return 0;
}