马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
位运算2
位运算应用
例题1:分析以下程序的位运算的结果
#include<stdio.h>
int main()
{
unsigned char a,b,c; //声明字符类型变量
a=0x3; //a是十六进制数
b=a|0x8; //按位或
c=b<<1; //左移运算
printf("%d\n%d\n",b,c);
return 0;
}
例题分析:
变量a的二进制数:(00000011)
0x8的二进制数:(00001000)
变量b的二进制数:
00000011
| 00001000
00001011 十进制11的二进制码
变量b左移1位,结果是:(00010110)
所以变量c的值是十进制22。
例题2:取一个整数a的二进制形式从右端开始的4~7位,并以八进制形式输出。
#include<stdio.h>
int main()
{
unsigned short a,b,c,d; //声明字符型变量
scanf("%o",&a);
b=a>>4; //右移运算
c=~(~0<<4); //取反左移后再取反
d=b&c; //按位与
printf("%o\n%o\n",a,d);
return 0;
例题分析:
本范例分3步运行,先使a右移4位,然后设置一个低4位全为1、其余全为0的数,可用~(~0<<4),最后将上面二者进行&运算。
我们输入的八进制数是1640,转换为二进制数是 0000001110100000,获取其右端开始的4~7位是二进制数1010,转换为八进制就是12。
例题3:将无符号数a右循环移n位,即将a中原来左面(16-n)位右移n位,即将a中原来左面(16-n)位右移n位,原来右端n位移到最左面n位。
#include<stdio.h>
int main()
{
unsigned short a,b,c; //声明字符型变量
int n;
scanf("%o,%d",&a,&n); //输入八进制和十进制
b=a<<(16-n); //左移运算
c=a>>n; //右移运算
c=c|b; //按位或
printf("%o\n%o\n",a,c); //输出八进制
return 0;
}
例题分析:
本范例分3步进行,将a,右端的n位先放到b中的高n位中,实现语句b=a<<(16n);将a右移n位,其左面高位n位补0,实现语句c=a>>n;最后c与b进行按位与或运算,即c=c|b。
我们输入的八进制数是1641,转换为二进制数是0000001110100001,获取其循环移3位,结果是0010000001110100,转换为八进制就是20164。
|