马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
位运算3
综合应用——数制转换
例题1:从键盘上输入一个是十进制正整数,按二进制位输出该数。
#include<stdio.h>
int main()
{
unsigned short a,b,i; //声明无符号短整型
printf("请输入一个整型数:");
scanf("%u",&a); //输入无符号整形
b=1<<15; //构造一个最高位为1、其余各位为0的整数
printf("%u=",a);
for(i=1;i<=16;i++)
{
putchar(a&b?'1':'0'); //输出最高为的值(1/0)
a<<=1; //将次高位移到最高位上
if(i%4==0)putchar(','); //4位一组用逗号分开
}
printf("\bB\n");
return 0;
}
例题分析:
本例题使用按位与配合右移运算,依次输出了二进制的每一位。
位运算总结
按位运算是对字节或字中的实际位进行检测、设置或移位,它只适用于字符型和整数型变量以及它们的变体,对其他数据类型不适用。我们要注意区分运算和逻辑运算。
1.按位与运算
按位与运算符 "&" 是双目运算符,其功能是参与运算的两数各对应的二进位相与。只有对应的两个二进位均为1时,结果位才为1,否则为0。参与运算的数以补码方式出现。
按位与运算通常用来对某些位清0或保留某些位。例如把a的高8位清0,保留低8位,可作a&255运算(255的二进制数为0000000011111111)。
main()
{
int a=9,b=5,c;
c=a&b;
printf("a=%d/nb=%d/nc=%d/n",a,b,c);
}
2.按位或运算
按位或运算符 "|" 是双目运算符,其功能是参与运算的两数各对应的二进位相或。只要对应的2个二进位有一个为1时,结果位就为1。参与运算的两个数均以补码出现。
例如,9|5可写算式00001001|00000101。
00001101(十进制为13)可见9|5=13
main()
{
int a=9,b=5,c;
c=a|b;
printf("a=%d/nb=%d/nc=%d/n",a,b,c);
}
3.按位异或运算
按位异或运算符 "^" 是双目运算符,其功能是参与运算的两数各对应的二进位相异时。结果为1。参与运算数仍以补码出现,例如,9^5可写成算式00001001^00000101=00001100(十进制为12)。
main()
{
int a=9;
a=a^15;
printf("a=%d/n",a);
}
4.求反运算
求反运算 "~" 为单目运算符,具有右结合性,其功能是对参与运算的数的各二进位按位求反。
例如,~9的运算符为~(0000000000001001)结果为1111111111110110。
5.左移运算
左移运算符 "<<" 是双目运算符,其功能把 "<<" 左边的运算数的各二进位全部左移若干位,由 "<<" 右边的数指定移动的位数,高位丢弃,低位补0。
例如,a<<4指把a的各二进位向左移动4位。如a=00000011(十进制3),左移4位后为00110000(十进制48)。
6.右移运算
右移运算符 ">>" 是双目运算符,其功能是把 ">>" 左边的运算数的各二进位全部右移若干位,">>" 右边的数指定移动的位数。
例如,a=15,a>>2表示把00001111右移为00000011(十进制3)。应该说明的是,对于有符号数,在右移时,符号位将随同移动。当为正数时,最高位补0,而为负数时,符号位为1,最高位是补0或是补1取决于编译系统的规定。
main()
{
unsigned a,b;
printf("input a number:");
scanf("%d",&a);
b=a>>5;
b=b&15;
printf("a=%d/tb=%d/n",a,b);
}
|