版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第11章位运算11.1位运算符和位运算11.2位运算举例在计算机内部,数据是由二进制表示的。在一些系统软件中,常常需要对某些数据的二进制位进行处理,例如,对某些二进制位清0、将一个存储单元中的二进制位左移或右移等。
位运算指的是对数据按二进制位进行的各种运算。C语言提供了区别于其它高级语言的位运算,使程序员编写程序时可以对数据的二进制位进行控制和操作。这也是C语言与其它高级语言相比具有广泛的用途和很强生命力的原因所在。
C语言提供的位运算符有6个,它们分别是:&(按位与)、|
(按位或)、^
(按位异或)、~
(按位取反)、<<
(左移)、>>
(右移)。其中
~
(按位取反)是单目运算符,其它均为双目运算符。
位运算的对象只能是整型数据和字符型数据,且以补码形式出现,其它类型的数据不能进行位运算。11.1位运算符和位运算
1. &(按位与运算符)
按位与运算符(&)的运算规则是:参加运算的两个数据,如果两个相应的二进制位的值都为1,则该位的结果为1,否则为0。
例如,6&11的运算过程为(假设6和11分别用两个字节表示)
所以,6&11的运算结果为2。按位与运算通常用来将一个数据的某些位清0或保留某些位。
如果要将一个数据的某些位清0,而某些位保留,则只需让这个数据和这样一个数进行按位与运算即可,这个数的二进制位中要清0的位全为0,要保留的位全为1。
例如,将一个数X的低4位保留,其余位清0,则只需和15进行按位与运算即可。
2. | (按位或运算符)
按位或运算符(
|
)的运算规则是:参加运算的两个数据,如果两个相应的二进制位的值都为0,则该位的结果为0,否则为1。
例如,6|11的运算过程为
所以,6|11的运算结果为15。按位或运算通常用来将一个数据的某些位置为1。
如果要将一个数据的某些位置1,则只需让这个数据和这样一个数进行按位或运算即可,这个数的二进制位中要置1的位全为1,其余的位全为0。
例如,将一个数X的低4位置1,其余位不变,则只需和15进行按位或运算即可。
3. ^ (按位异或运算符)
按位异或运算符(^)的运算规则是:参加运算的两个数据,如果两个相应的二进制位的值相同(都为0或都为1),则该位的结果为0,否则为1。
例如,6^11的运算过程为
所以,6^11的运算结果为13。按位异或运算通常用来将一个数据的某些位翻转(0变为1,1变为0)或保留某些位。
如果要将一个数据的某些位翻转,则只需让这个数据和这样一个数进行按位异或运算即可,这个数的二进制位中要翻转的位全为1,其余的位全为0。
例如,将整数65的低8位翻转,高8位不变,则只需和255进行按位异或运算即可。
所以,整数65的低8位翻转、高8位不变的结果就是整数190。
4. ~(按位取反运算符)
按位取反运算符(~)的运算规则是:参加运算的数据,如果二进制位的值为0,则该位的结果为1,否则为0。
例如,~6的运算过程为
所以,~6的运算结果为
-7。
按位取反运算通常用来将一个数据的所有位翻转(0变为1,1变为0)。
5. << (左移运算符)
左移运算符(<<)的运算规则是:将参加运算的数据的各二进制位全部左移指定的位数,左边(高位)移出的位舍弃,右边(低位)空出的位补0。
例如,a<<4就是将变量a的值的各二进制位左移4位。如果a的值为6,则其运算过程为
所以,a<<4的运算结果为96。如果左移出去被舍弃的二进制位中没有1,则左移1位相当于将该数乘以2,左移n位相当于将该数乘以2n(96就是6
×
24)。但是,如果左移出去被舍弃的二进制位中包含1,则不适用此规律。
6. >> (右移运算符)
右移运算符(>>)的运算规则是:将参加运算的数据的各二进制位全部右移指定的位数,右边(低位)移出的位舍弃,左边(高位)空出的位根据以下两种情况补0或补1。
(1)对无符号整数进行右移时,左边空出的二进制位补0。这种右移称为逻辑右移。
(2)对有符号整数进行右移时,左边空出的二进制位以“符号位”填补,即正数补0,负数补1。这种右移称为算术右移。例如,a>>4就是将变量a的值的各二进制位右移4位。如果a的值为96,则其运算过程为
所以,a>>4的运算结果为6。如果右移出去被舍弃的二进制位中没有1,则右移1位相当于将该数除以2,右移n位相当于将该数除以2n(6就是96÷24)。但是,如果右移出去被舍弃的二进制位中包含1,则不适用此规律。
7.位运算符的优先级和结合性
表11-1给出了算术运算符的优先级和结合性。表11-1算术运算符的优先级和结合性8.复合位运算赋值
表11-2复合位运算赋值运算符9.位运算的应用
(1)判断一个整数的某位是否为1。
例如,判断一个int型变量a的最高位是否为1时,可以设一个与a同类型的测试变量test,将test的最高位设为1,其余各位均设为0,即inttest=0x8000;。根据“按位与”运算规则,只要判断表达式a&test的值就可以了。如果表达式的值等于test变量的值,则说明变量a的最高位为1;如果表达式的值等于0,则说明a的最高位为0,如图11-1所示。
图11-1判断变量a的最高位是否为1
(2)屏蔽掉一个整数中的某些位。
例如,保留整数a的低字节,屏蔽掉其高字节。只需要将a和b进行按位与运算,其中将变量b的高字节8位二进制码都设为0,低字节的8位二进制码都设为1,即令intb=0xff;,如图11-2所示。图11-2屏蔽变量a的高字节
(3)把一个整数的某位设置为1。
例如,把a的第10位设置为1,而且不破坏其它位。可以对变量a和b进行按位或运算,其中将变量b的第10位设为1,其它各位设为0,即令intb=0x400;,如图11-3所示。图11-3将变量a的第10位设置为1
(4)把一个整数的某位翻转,即将1变为0,0变为1。
例如,要把变量a的奇数位翻转,可以对变量a和b进行按位异或运算,其中将变量b的所有奇数位设置为1,偶数位设置为0,即令intb=0xaaaa;,如图11-4所示。图11-4将变量a的奇数位翻转
【例11.1】编写程序,取一个整数从右边开始的4~7位。
程序分析:可以先考虑将要输出的位移到低4位(即m>>4),然后再用一个低4位为1、其余位为0的数与其按位与即得到该数。11.2位 运 算 举 例设置一个低4位为1、其余位全为0的数,方法是先将所有位都置1(~0),然后再左移4位,再取反,即~(~0<<4)。(不能简单地用0x000f,因为不同的系统整数所占位数不同。)
程序如下:
#include<stdio.h>
main()
{
unsignedm,n,i,j;
printf("Inputm:");
scanf("%d",&m);
i=m>>4;
j=
~(~0<<4);
n=i&j;
printf("m=%d,\t%x\nn=%d,\t%x\n",m,m,n,n);
}
程序运行结果:
Inputm:987↙
m=987,3db
n=13,d
【例11.2】
编写程序,将一个整数的右边n位移至左边,左边的16-n位移至右边。
程序分析:将整数m右移n位保存到一个变量中,该变量的高n位为0,低16-n位就为m的高16-n位;将整数m左移16-n位保存到一个变量中,该变量的低16-n位为0,高n位就为m的低n位;然后将这两个变量进行按位或运算,运算结果即为所得。程序如下:
#include<stdio.h>
main()
{
unsignedm,i,j,k;
intn;
printf("Inputm,n:");
scanf("%d%d",&m,&n);
i=m>>n;
j=m<<(16-n);
k=i|j;
printf("m=%d,\t%x\nk=%d,\t%x\n",m,m,k,k);
}
程序运行结果(注:系统不同,输出结果会有差异):
Inputm,n:456784↙
m=-19858,b26e
k=-5338,eb26
【例11.3】
编写程序,输入一个整数,统计该整数所对应的二进制数中1的个数。
程序分析:
算法1:对于输入的整数m,判断它的第0位是否为1,如果是,计数器加1,然后右移1位,再判断它的第0位是否为1,如果是,计数器再加1,……如此重复16次。
算法2:对于输入的整数m,判断它的第0位是否为1,如果是,计数器加1,然后再判断它的第1位是否为1,如果是,计数器再加1,……如此重复,直到判断它的第15位是否为1,如果是,计数器加1。程序如下:
程序1:
#include<stdio.h>
main()
{
intm,count,i;
printf("Inputm:");
scanf("%d",&m);
count=0;
for(i=0;i<16;i++){
if((m&0x01)==1)
count++;
m=m>>1;
}
printf("Numbersof1inmis%d.\n",count);
}
程序运行结果:
Inputm:15↙
Numbersof1inmis4.
程序2:
#include<stdio.h>
main()
{
intm,count,i,k;
printf
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年度工程项目外墙铝板施工合同2篇
- 2024年沙盘模型加工生产合同2篇
- 二零二四年度智能工厂生产管理系统采购合同3篇
- 娱乐产业租赁居间协议
- 篮球馆戏剧表演租赁协议
- 服装行业工作人员证件管理办法
- 广告行业反贿赂管理框架
- 2024年工程监理居间条款示例2篇
- 互联网服务合同招标管理办法
- 智能语音开发票协议书
- 放射科质控汇报
- 早读励志的教案
- 咖啡学概论智慧树知到答案章节测试2023年华南理工大学
- 林规发防护林造林工程投资估算指标
- 三年级上册语文第六单元单元教学总结1
- 通信原理实验指导书
- YS/T 89-2011煅烧α型氧化铝
- 加油站安全生产专项整治三年行动工作方案
- 2022年军队文职人员招聘之军队文职管理学通关题库(附带答案)
- 2022年11月苏州城市学院下半年公开招聘27名管理岗位工作人员0上岸冲刺题3套【600题带答案含详解】
- 第12课《渔家傲 秋思》课件(30张PPT) 部编版语文九年级下册
评论
0/150
提交评论