Vissza

Bitműveletek
Megjegyzés: Az alábbi  értékadások ekvivalensek

x = y * 8;
x = y << 3;

x = y * 64;
x = y << 6;

x = y * 32768;
x = y << 15;
x = y / 4;
x = y >> 2;

x = y / 32;
x = y >> 5;
x = y % 8;
x = y & 7;

x = y % 32;
x = y & 31;

x = y % 256;
x = y & 255;

Házi feladatok:
1. Írjunk függvényt mely egy megadott unsigned típusú változó esetében 1-re állítja a paraméterként megadott bittet.
2. Írjunk függvényt mely egy megadott unsigned típusú változó esetében 0-ra állítja a paraméterként megadott bittet.
3. Írjunk programot, mely beolvas n, unsigned típusú változót a billentyűzetről és mindegyiket titkosítja, XOR műveletet használva.
4. Írjuk ki 2 hatványait növekvő, majd csökkenő sorrendbe, amíg a gépszó hosszúsága engedi, biteltolás operátort használva.
5. Írjuk ki egy unsigned típusú változó tartalmát 2-es számrendszerbe, bitoperátorok használatával.
6. Írjunk programot, mely egy szövegállományban levő (x, n) számpárok mindegyikére meghatározza xn értékét; alkalmazzuk a 5. megoldott feladat my_pow függvényét.
7. Írjunk programot, amely titkosítja a megadott bináris állományt, XOR műveletet használva.

Megoldott feladatok:

1. Adott unsigned típusú változó esetében 1-re állítjuk a legalsó helyiértékű bittet.
#include <iostream>
using namespace std;
unsigned OR_muv(unsigned);

int main(){
    unsigned a;
    cout << "paros szam: ";
    cin >> a;

    cout << "Or elott(hexaban): \t\t";
    cout << hex << a << endl;
    cout << "Or elott(decimalisan): \t\t";
    cout << dec << a <<endl<<endl;

    a = OR_muv(a);
    cout << "Or utan(hexaban): \t\t";
    cout << hex << a << endl;
    cout << "Or utan(decimalisan): \t\t";
    cout << dec << a <<endl<<endl;
    return 0;
}

unsigned OR_muv(unsigned a){
    a = a | 0x1;
    return a;
}


2. Adott unsigned típusú változó esetében 0-ra állítjuk az 5-ös bittet.
#include <iostream>
using namespace std;
unsigned END_muv(unsigned);

int main(){
    unsigned a;
    cout << "paros szam: ";
    cin >> a;
    cout << "End elott(hexaban): \t\t";
    cout << hex << a << endl;
    cout << "End elott(decimalisan): \t";
    cout << dec << a <<endl<<endl;
    a = END_muv(a);
    cout << "End utan(hexaban): \t\t";
    cout << hex << a << endl;
    cout << "End utan(decimalisan): \t\t";
    cout << dec << a <<endl<<endl;
}

unsigned END_muv(unsigned a)
{
    unsigned m = 0xffffffdf;
   
a = a & m;
    return a;
}


3. Titkosítsuk egy unsigned típusú változó értékét, egy kulcsértékkel, majd fejtsük vissza.( “xor” operator: ^ )
#include <iostream>
using namespace std;
unsigned XOR_muv(unsigned a, unsigned kulcs);

int main(){
    unsigned a, kulcs, kod_a, dekod_a;
    cout << "szam: ";
    cin >> a;
    cout << "kulcs: ";
    cin >> kulcs;

    kod_a = XOR_muv(a, kulcs);
    cout << "Kodolva(hexaban): \t\t";
    cout << hex << kod_a << endl;
    cout << "Kodolva(decimalisan): \t\t";
    cout << dec << kod_a << endl << endl;

    dekod_a =
XOR_muv(kod_a, kulcs);
    cout << "Dekodolva(hexaban): \t\t";
    cout << hex << dekod_a << endl;
    cout << "Dekodolva(decimalisan): \t";
    cout
<< dec << dekod_a << endl << endl;
}

unsigned XOR_muv(unsigned a, unsigned kulcs){
    a = a ^ kulcs;
    return a;
}

4. Határozzuk meg egy egész szám 2-es számrendszerbeli alakját, 8 biten, bitoperátorok használatával.
#include <iostream>
using namespace std;
void szamrend(char a);

int main(){
    int a, a1;
    cout << "szam: ";
    cin >> a;
    szamrend(a);
   
return 0;
}

void szamrend(char a){
    char b, m, k;
   
m = 8 * sizeof(char) - 1;
    for(k = 0; k < 8*sizeof(char); k++) {
        b = (a >> m) & 1;
        cout << (int)b;
       
//negy bitenkent irjuk ki
        if (k%4 == 3) cout << " ";
        m--;
    }
    cout << endl;
}


5. Bitműveleteket alkalmazva határozzuk meg ak értékét, ahol a, k unsigned típusú változók.
#include <iostream>
using namespace std;
unsigned my_pow(unsigned a, unsigned k);

int main(){
    unsigned a, k;
    cout << "alap: ";
    cin >> a;
    cout << "kitevo: ";
    cin >> k;
    cout << "a^k = " << my_pow(a,k) << endl;
    return 0;
}

unsigned my_pow(unsigned a, unsigned k){
    unsigned res = 1;
    while (1){
        if (k == 0) return res;
        if (
k&1 ) res = a * res;
        a = a * a;
        k = k >> 1;
    }
}


6. Írjunk programot, mely felcseréli két változó tartalmát.( “xor” operator: ^ )
#include <iostream>
using namespace std;

int main(){
    unsigned a, b;
    cout << "a: ";
    cin >> a;
    cout << "b: ";
    cin >> b;

    b = a ^ b;
    a = a ^ b;
    b = a ^ b;
    cout << "Csere utan" << endl;
    cout << endl << "a: " << a;
    cout << endl << "b: " << b;
    cout << endl;
   
return 0;
}
A fenti feladatok standard C író/olvasó függvényekkel
1. Adott unsigned típusú változó esetében 1-re állítjuk a legalsó helyiértékű bittet.

#include <stdio.h>
unsigned OR_muv(unsigned a);

int main(){
    unsigned a, a1;
    printf("paros szam: ");
    scanf("%u", &a);
        
    printf("Or elott(hexaban): \t\t%x\n", a);
    printf("Or elott(decimalisan): \t\t%u\n\n", a);
   
a1 = OR_muv(a);
    printf("Or utan(hexaban): \t\t%x\n", a1);
    printf("Or utan(decimalisan): \t\t%u\n\n", a1);
   
return 0;
}

unsigned OR_muv(unsigned a){
   
a = a | 0x1;
    return a;
}


2. Adott unsigned típusú változó esetében 0-ra állítjuk az 5-ös bittet.

#include <stdio.h>
unsigned END_muv(unsigned a);

int main(){
    unsigned a, a1;
    printf("szam: ");
    scanf("%u", &a);
   
    printf("END elott(hexaban): \t\t%x\n", a);
    printf("END elott(decimalisan): \t%u\n\n", a);
   
a1 = END_muv(a);
    printf("END utan(hexaban): \t\t%x\n", a1);
    printf("END utan(decimalisan): \t\t%u\n\n", a1);
   
   
return 0;
}

unsigned END_muv(unsigned a)
{
    unsigned m = 0xffffffdf;
    a = a & m;
    return a;
}


3. Titkosítsuk egy unsigned típusú változó értékét, egy kulcsértékkel, majd fejtsük vissza.( “xor” operator: ^ )

#include <stdio.h>
unsigned XOR_muv(unsigned a, unsigned kulcs);

int main(){
    unsigned a, kulcs, kod_a, dekod_a;
    printf("szam: ");
    scanf("%u", &a);
    printf("kulcs: ");
    scanf("%u", &kulcs);
   
    kod_a = XOR_muv(a, kulcs);
    printf("Kodolva(hexaban): \t\t%x\n", kod_a);
    printf("Kodolva(decimalisan): \t\t%u\n\n", kod_a);
      
    dekod_a = XOR_muv(kod_a, kulcs);
    printf("Dekodolva(hexaban): \t\t%x\n", dekod_a);
    printf("Dekodolva(decimalisan): \t%d\n\n", dekod_a);
   
return 0;
}

unsigned XOR_muv(unsigned a, unsigned kulcs){
    a = a ^ kulcs;
    return a;
}


4. Határozzuk meg egy egész szám 2-es számrendszerbeli alakját, 32 biten, bitoperátorok használatával.

#include <stdio.h>
void szamrend(char a);

int main(){
    char a, a1;
    printf("szam: ");
    scanf("%d", &a);
   
    szamrend(a);
   
return 0;
}

void szamrend(char a){
    char b, m, k; //32 biten
    m = 8 * sizeof(char) - 1;
    for (k = 0; k < 8*sizeof(char); k++) {
       
b = (a >> m) & 1;
        printf("%d", b);
        //negy bitenkent irjuk ki
        if (k%4 == 3) printf(" ");
        m--;
    }
    printf("\n");
}


5. Bitműveleteket alkalmazva határozzuk meg ak értékét, ahol a, k unsigned típusú változók.
 
#include <stdio.h>
unsigned my_pow(unsigned a, unsigned k);

int main(){
    unsigned a, k; 
    printf("alap: ");
    scanf("%u", &a);
    printf("kitevo: ");
    scanf("%u", &k);
    printf("a^k = %u\n\n", my_pow(a,k));
    return 0;
}

unsigned my_pow(unsigned a, unsigned k){
    unsigned res = 1;
    while (1){
        if (k == 0) return res;
        if ( k&1 ) res = a * res;
        a = a * a;
        k = k >> 1;
    }
}


6. Írjunk programot, mely felcseréli két változó tartalmát.( “xor” operator: ^ )

#include <stdio.h>

int main(){
    unsigned a, b;
    printf("a: ");
    scanf("%u", &a);
    printf("b: ");
    scanf("%u", &b);
   
    b = a ^ b;
    a = a ^ b;
    b = a ^ b;
    printf("Csere utan\n");
    printf("\na: %u", a);
    printf("\nb: %u", b);
    printf("\n");
   
return 0;
}