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;
}