Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Практические / Пр №15.Битовая арифметика

.odt
Скачиваний:
6
Добавлен:
17.04.2015
Размер:
15.71 Кб
Скачать

Битовая арифметика

1.

//Работа поразрядного сдвига влево и вправо

#include <stdio.h>

#include <stdlib.h>

int main(void)

{

unsigned int w1=077u,w2=0176u,w3=0210u;

printf("%o ",w1=w1<<1);

printf("%o ",w2=w2>>1);

printf("%o ",w1=w1<<3);

printf("%o ",w2=w2>>3);

system ("pause");

return 0;

}

//176 77 1760 7

//Работа поразрядного исключающего оператора Или

#include <stdio.h>

#include <stdlib.h>

int main(void)

{

unsigned int w1=077u,w2=0150u,w3=0210u;

printf("%o ",w1^w2);

printf("%o ",w1^w2);

printf("%o ",w1^w2^w3);

printf("%o ",w1^1);

int temp,i1=5,i2=9;

printf("i1= %i i2= %i\n",i1,i2);

temp=i1;

i1=i2;

i2=temp;

printf("i1= %i i2= %i\n",i1,i2);

i1^=i2;

i2^=i1;

i1^=i2;

printf("i1= %i i2= %i\n",i1,i2);

system ("pause");

return 0;

}

//177 177 377 77

//5 9

//9 5

//5 9

//Работа поразрядного оператора Или

#include <stdio.h>

#include <stdlib.h>

int main(void)

{

unsigned int w1=077u,w2=0150u,w3=0210u;

printf("%o ",~w1);

printf("%o ",~w2);

printf("%o ",~w3);

system ("pause");

return 0;

}

//37777777700 3777777627 37777777567

//Работа поразрядного сдвига влево и вправо с помощью функции.

#include <stdio.h>

#include <stdlib.h>

unsigned int shift(unsigned int val,int n);

int main(void)

{

unsigned int w1=077u,w2=0176u,w3=0210u;

printf("%o ",shift(w1,1));

printf("%o ",shift(w2,-1));

system ("pause");

return 0;

}

unsigned int shift(unsigned int val,int n)

{if(n>0)val<<=n;

else val>>=-n;

return val;}

//176 77 1760 7

// Сдвиг влево на 1 бит

#include <stdio.h>

#include <stdlib.h>

int main(void)

{

unsigned char a=0300,b=0000,c=0000,x=0200;

printf("a= %o b= %o x= %o \n ",a,b,x);

b=a&x;

printf("a= %o b= %o x= %o \n ",a,b,x);

b=b>>7;

printf("a= %o b= %o x= %o \n ",a,b,x);

a=a<<1;

printf("a= %o b= %o x= %o \n ",a,b,x);

a=a|b;

printf("a= %o b= %o x= %o \n ",a,b,x);

system ("pause");

return 0;

}

//a=300 b=0 x=200

//a=300 b=200 x=200

//a=300 b=1 x=200

//a=200 b=1 x=200

//a=201 b=1 x=200

// Функция ротации влево на n бит

#include <stdio.h>

#include <stdlib.h>

unsigned char sdv(unsigned char a,int n);

int main(void)

{

unsigned char a=0300,d;

int n;

for (n=0;n<10;n++){

d=sdv(a,n);

printf("d= %o \n ",d);

}

system ("pause");

return 0;

}

unsigned char sdv(unsigned char a,int n)

{

unsigned char b=0000,x=0200;

if (n==0) return (a);

else

for (int i=0;i<n;i++)

{

b=a&x;

b=b>>7;

a=a<<1;

a=a|b; }

return (a);}

// Функция ротации влево

#include <stdio.h>

#include <stdlib.h>

unsigned char sdv(unsigned char a,int n);

int main(void)

{

unsigned char a=0300,d;

int n;

for (n=0;n<10;n++){

d=sdv(a,n);

printf("d= %o \n ",d);

}

system ("pause");

return 0;

}

unsigned char sdv(unsigned char a,int n)

{

unsigned char b=0000,x=0200;

if (n==0) return (a);

else

for (int i=0;i<n;i++)

{

b=a&x;

b=b>>7;

a=a<<1;

a=a|b; }

return (a);}

//300

//201

//3

//6

//14

//30

//60

//140

//300

// Функция ротации вправо на n позиций

#include <stdio.h>

#include <stdlib.h>

unsigned char sdv(unsigned char a,int n);

int main(void)

{

unsigned char a=0300,d;

int n;

for (n=0;n<10;n++){

d=sdv(a,n);

printf("d= %o \n ",d);

}

system ("pause");

return 0;

}

unsigned char sdv(unsigned char a,int n)

{

unsigned char b=0000,x=001;

if (n==0) return (a);

else

for (int i=0;i<n;i++)

{

b=a&x;

b=b<<7;

a=a>>1;

a=a|b; }

return (a);}

//300

//140

//60

//30

//14

//6

//3

//201

//300

// Функция ротации

#include <stdio.h>

#include <stdlib.h>

int main(void)

{

unsigned int rotate(unsigned int val,int n);

unsigned int w1=0xabcdef00u,w2=0xffff1122u;

printf("%x\n ",rotate(w1,8));

printf("%x\n ",rotate(w1,-16));

printf("%x\n ",rotate(w2,4));

printf("%x\n ",rotate(w2,-2));

printf("%x\n ",rotate(w1,0));

printf("%x\n ",rotate(w1,44));

system ("pause");

return 0;

}

unsigned int rotate(unsigned int val,int n)

{

unsigned int res, bits;

if(n>0)n=n%32;

else n=-(-n%32);

if (n==0)res=val;

else

if (n>0){

bits=val>>(32-n);

res=val<<n | bits;

}

else

{n=-n;

bits=val<<(32-n);

res=val>>n |bits;

}

return res;

}

// cdtfooab

// tfooabcd

// fff1122f

// bfffc448

// abcdef00

// defooabc

// Макрокоманда сдвига влево на 1 бит

#include <stdio.h>

#include <stdlib.h>

#define SDVIGL(a) ((a&200)>>7)|(a<<1);

int main(void)

{

unsigned char a=0300;

c=SDVIGL(a);

printf("a= %o \n ",c);

system ("pause");

return 0;

}

//a=300 b=0 x=200

//a=201 b=1 x=200

Домашнее задание:

Разработать алгоритм и написать программу функции сдвига влева и вправо на N бит.

n>0 сдвиг влево n<0 сдвиг вправо, с использованием макрокоманды