Практические / Пр №15.Битовая арифметика
.odtБитовая арифметика
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 сдвиг вправо, с использованием макрокоманды