说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

位运算-C语言教程

HTML文档下载 WORD文档下载 PDF文档下载
前面介绍的各种运算都是以字节作为最基本位进行的。 但在很多系统程序中常要求在位(bit)一级进行运算或处理。C语言提供了位运算的功能,这使得C语言也能像汇编语言一样用来编写系统程序。
前面介绍的各种运算都是以字节作为最基本位进行的。 但在很多系统程序中常要求在位(bit)一级进行运算或处理。C语言提供了位运算的功能,这使得C语言也能像汇编语言一样用来编写系统程序。
12.1 位运算符C语言提供了六种位运算符:
    &          按位与
    |          按位或
    ^          按位异或
    ~          取反
    <<         左移
    >>         右移
12.1.1 按位与运算
    按位与运算符"&"是双目运算符。其功能是参与运算的两数各对应的二进位相与。只有对应的两个二进位均为1时,结果位才为1,否则为0。参与运算的数以补码方式出现。
例如:9&5可写算式如下:
      00001001        (9的二进制补码)
     &00000101        (5的二进制补码)
      00000001        (1的二进制补码)
可见9&5=1。
按位与运算通常用来对某些位清0或保留某些位。例如把a 的高八位清 0 ,保留低八位,可作a&255运算( 255 的二进制数为0000000011111111)。
【例12.1】
main(){    int a=9,b=5,c;    c=a&b;    printf("a=%d\nb=%d\nc=%d\n",a,b,c);}
12.1.2 按位或运算
按位或运算符“|”是双目运算符。其功能是参与运算的两数各对应的二进位相或。只要对应的二个二进位有一个为1时,结果位就为1。参与运算的两个数均以补码出现。
例如:9|5可写算式如下:
    00001001
   |00000101
    00001101        (十进制为13)可见9|5=13
【例12.2】
main(){    int a=9,b=5,c;    c=a|b;    printf("a=%d\nb=%d\nc=%d\n",a,b,c);}
12.1.3 按位异或运算
   按位异或运算符“^”是双目运算符。其功能是参与运算的两数各对应的二进位相异或,当两对应的二进位相异时,结果为1。参与运算数仍以补码出现,例如9^5可写成算式如下:
     00001001
    ^00000101  
     00001100       (十进制为12)
【例12.3】
main(){    int a=9;    a=a^5;    printf("a=%d\n",a);}
12.1.4 求反运算
求反运算符~为单目运算符,具有右结合性。其功能是对参与运算的数的各二进位按位求反。
例如~9的运算为:
    ~(0000000000001001)结果为:1111111111110110
12.1.5 左移运算
左移运算符“<<”是双目运算符。其功能把“<< ”左边的运算数的各二进位全部左移若干位,由“<<”右边的数指定移动的位数,高位丢弃,低位补0。
例如:
    a<<4
指把a的各二进位向左移动4位。如a=00000011(十进制3),左移4位后为00110000(十进制48)。
12.1.6 右移运算
   右移运算符“>>”是双目运算符。其功能是把“>> ”左边的运算数的各二进位全部右移若干位,“>>”右边的数指定移动的位数。
例如:
设  a=15,
a>>2
表示把000001111右移为00000011(十进制3)。
应该说明的是,对于有符号数,在右移时,符号位将随同移动。当为正数时,最高位补0,而为负数时,符号位为1,最高位是补0或是补1 取决于编译系统的规定。Turbo C和很多系统规定为补1。
【例12.4】
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);}
请再看一例!
【例12.5】
main(){    char a='a',b='b';    int p,c,d;    p=a;    p=(p<<8)|b;    d=p&0xff;    c=(p&0xff00)>>8;    printf("a=%d\nb=%d\nc=%d\nd=%d\n",a,b,c,d);}
12.2 位域(位段)
有些信息在存储时,并不需要占用一个完整的字节,而只需占几个或一个二进制位。例如在存放一个开关量时,只有0和1两种状态,用一位二进位即可。为了节省存储空间,并使处理简便,C语言又提供了一种数据结构,称为“位域”或“位段”。
所谓“位域”是把一个字节中的二进位划分为几个不同的区域,并说明每个区域的位数。每个域有一个域名,允许在程序中按域名进行操作。这样就可以把几个不同的对象用一个字节的二进制位域来表示。
1. 位域的定义和位域变量的说明
位域定义与结构定义相仿,其形式为:
    struct 位域结构名
       { 位域列表 };
其中位域列表的形式为:
    类型说明符 位域名:位域长度  
例如:
    struct bs
     {
       int a:8;
       int b:2;
       int c:6;
     };
位域变量的说明与结构变量说明的方式相同。 可采用先定义后说明,同时定义说明或者直接说明这三种方式。
例如:
    struct bs
     {
       int a:8;
       int b:2;
       int c:6;
     }data;
说明data为bs变量,共占两个字节。其中位域a占8位,位域b占2位,位域c占6位。
对于位域的定义尚有以下几点说明:
1) 一个位域必须存储在同一个字节中,不能跨两个字节。如一个字节所剩空间不够存放另一位域时,应从下一单元起存放该位域。也可以有意使某位域从下一单元开始。
例如:
struct bs
     {
       unsigned a:4
       unsigned :0        /*空域*/
       unsigned b:4       /*从下一单元开始存放*/
       unsigned c:4
     }
    在这个位域定义中,a占第一字节的4位,后4位填0表示不使用,b从第二字节开始,占用4位,c占用4位。
2) 由于位域不允许跨两个字节,因此位域的长度不能大于一个字节的长度,也就是说不能超过8位二进位。
3) 位域可以无位域名,这时它只用来作填充或调整位置。无名的位域是不能使用的。例如:
    struct k
     {
      int a:1
      int  :2          /*该2位不能使用*/
      int b:3
      int c:2
     };
从以上分析可以看出,位域在本质上就是一种结构类型,不过其成员是按二进位分配的。
2. 位域的使用
位域的使用和结构成员的使用相同,其一般形式为:
  位域变量名•位域名
  位域允许用各种格式输出。
【例12.6】
main(){    struct bs    {      unsigned a:1;      unsigned b:3;      unsigned c:4;    } bit,*pbit;    bit.a=1;    bit.b=7;    bit.c=15;    printf("%d,%d,%d\n",bit.a,bit.b,bit.c);    pbit=&bit;    pbit->a=0;    pbit->b&=3;    pbit->c|=1;    printf("%d,%d,%d\n",pbit->a,pbit->b,pbit->c);}
上例程序中定义了位域结构bs,三个位域为a,b,c。说明了bs类型的变量bit和指向bs类型的指针变量pbit。这表示位域也是可以使用指针的。程序的9、10、11三行分别给三个位域赋值(应注意赋值不能超过该位域的允许范围)。程序第12行以整型量格式输出三个域的内容。第13行把位域变量bit的地址送给指针变量pbit。第14行用指针方式给位域a重新赋值,赋为0。第15行使用了复合的位运算符"&=",该行相当于:
    pbit->b=pbit->b&3
位域b中原有值为7,与3作按位与运算的结果为3(111&011=011,十进制值为3)。同样,程序第16行中使用了复合位运算符"|=",相当于:
pbit->c=pbit->c|1
其结果为15。程序第17行用指针方式输出了这三个域的值。
12.3 本章小结
1. 位运算是C语言的一种特殊运算功能, 它是以二进制位为单位进行运算的。位运算符只有逻辑运算和移位运算两类。位运算符可以与赋值符一起组成复合赋值符。如&=,|=,^=,>>=,<<=等。
2. 利用位运算可以完成汇编语言的某些功能,如置位,位清零,移位等。还可进行数据的压缩存储和并行运算。
3. 位域在本质上也是结构类型,不过它的成员按二进制位分配内存。其定义、说明及使用的方式都与结构相同。
4. 位域提供了一种手段,使得可在高级语言中实现数据的压缩,节省了存储空间,同时也提高了程序的效率。
2013,谷歌的数据科学家都将干什么呢? Facebook“也”对服务器进行浸泡冷却 日本最大电脑商:Windows 8表现并不好 日均新增415个应用,Windows 8应用总数突破35000 百度推出图像搜索引擎“百度识图” 可基于图像实现全网人脸搜索 解决专利纠纷 RIM向诺基亚预付6500万 巨头的得意与失落:2012移动游戏十大收购案 Mozilla或许将发布iOS平台浏览器Junior Mozilla:Facebook手机将采用Firefox OS Anonymous2013年将放慢脚步,McAfee预测遭质疑 一周消息树:Facebook公布2012年Hackathon大赛顶级“黑客作品” HTML+CSS+JS 开发 Firefox OS 应用编程实战 前端开发工程师如何在2013年里提升自己 Java受Objective-C影响很大 而不是C++ Instagram回击报告指责:用户仍保持增长态势 回顾:2012年科技行业十大败笔 苹果地图入选 Amazon CEO Jeff Bezos:好年景,大挑战 2012年度盘点:移动互联网大事件回顾 详解Amazon Redshift 移动周报:再见,2012!你好,2013! 英特尔或在2月宣布其电视计划:提供分类频道 Prismatic:用机器学习分析用户兴趣只需10秒钟 谷歌布局亚太地区数据中心建设 服务响应速度有望提升30% 2013年移动互联网行业技术趋势前瞻 老骥伏枥志在千里:回顾微软这一年 2013或将崛起 水落石出:在与谷歌苹果竞购创业公司中微软胜出 用扁平化的界面设计吸引用户 2012年12月份全球主流浏览器市场份额排行榜 冲榜不一定要刷榜:增加游戏曝光度的7大杀手锏 科技vs政治:FTC对Google的反垄断调查结束背后 威胁百度:奇虎360确认将与谷歌达成合作关系 关于数据库中图象的存取问题,100全送! PowerDesigner8 显示与oracle连接信息? PopupMenu如何知道是由哪一个控件激活的(几个控件共用一个PopupMenu) 如何通过序数从DLL引出函数表? 有关datagrid的border问题? 在pb中用SetPicture(lb_image)当lb_image为空时picture的图片不变 急!!急!!如何用MultiByteToWideChar()实现Unicode编码?? 请问:这是叫什么服务来着? 请问有没有有关工作流技术的理论和资料 windowsXP与Visual C++问题??? 发布目录在哪里问题!!!!急急急 请教一个entity bean的问题 调查一下,微软的工程师工资有多少呀?做什么软件的工资最高? idhttp.get可以获得htm 文件,我现在想得到gif文件,怎么办? 不知大家有没有听说过Tapestry,是一个有关权限管理的开发原代码 请问C标准函数里是否有这样的函数,可以删除文件名相同但忽略扩展名的函数,如可以同时删除A1.LIN和A1.SA?谢先!!! 如何修改硬盘序列号(不是卷序列号,而是出厂序列号)? MS EXCHANGE SERVER 2000 在WEB页面更改MAILBOX的密码 关于string的简单问题 String和StringBuffer的具体区别是什么? 请问哪里有<<com原理与应用 >>电子书下载?谢谢 高级问题:如何实现在应用程序中动态布置控件。(分数不是问题) TList问题 请问: 我进不了windows2000 advanced server!!怎么办? 北京程序员俱乐部的相关问题 如何修改硬盘序列号(不是卷序列号,而是出厂序列号)? 请问C标准函数里是否有这样的函数,可以删除文件名相同但忽略扩展名的函数,如可以同时删除A1.LIN和A1.SA?谢先!!! 如何用DAO调用MSSQLSERVER中的存储过程获得结果集? sybase的字符串连接符是哪个 如何取得上网ip?(不是本地IP),在局域网中,客户机通过主机代理上网,能否确定客户是否连在网上? 请问网络高手--怎样知道对方的物理地址(知道对方的IP)??? 图片存在数据库中,在asp页上如何让其显示出来!? 如何把文件或图片以Blob类型存入Oracle数据库,并在JSP中把数据库中的Blob数据以最初的文件格式读出来??? 如何把文件或图片以Blob类型存入Oracle数据库,并在JSP中把数据库中的Blob数据以最初的文件格式读出来??? 请问大伙《TCP/IP详解》1,2,3卷----机械械工业出版社,是否值得购买?翻译的怎么样? CRYSTAL REPORTS DEVELOPER EDITION VERSION 哪里有下? 如何控制excel中的图表? 我想在我彻底陷去之前再清醒的看看这个世界..... 十万火急!!!IIS报HTTP 500的错误。 select时间段问题 请推荐uml方面的好书!! CreateWindow和MFC的CFrameWnd::LoadFrame产生的窗口的区别?? 在pb中用SetPicture(lb_image)当lb_image为空时picture的图片不变 有一段代码破不理解?谢谢! 在pb中用SetPicture(lb_image)当lb_image为空时picture的图片不变 用JAVA开发企业MIS系统,需要注意那些? 怎么在没有资源的项目里加入菜单资源?(急) 有一段代码破不理解?谢谢! 如何动态设置一个字段的类型。例如:下拉型,EDIT型,EDITMAST型。急用!!! 试解释月球上的一些现象1.月球比太阳小得多,但对地球的引力却最大2.月球上永远万籁俱静,听不到任何声音太阳系中主要天体排列成“十字连星”形状的原因是什么?太阳系主要天体在运动过 已知关于X的方程组4x+3m=2 8x-3y=m的解满足x>0,y>0 求m的取值范围 设椭圆C1的中心在原点,其右焦点与抛物线C2:y^2=4x的焦点F重合,过F与x轴垂直的直线与C交于A、B两点,与C2交于C、D两点,已知|CD|/|AB|=4/3(I)求椭圆C1的方程(II)过点F的直线L与C1交于M、N两点,与C2交于 那位高手能帮忙做到GRE题呢?谢拉~3.Although some censure became (i)___ during the 1980s,Dahl himself seems to support some of such earlier criticism.Although he (ii)___ that some Western intellectuals demand more democracy from polyarchi 关于x的多项式6x的n-1次方-4x+k-是二次二项式,则n=(),k=()最好解释一下为什么这么做 已知抛物线C1:x^2+by=b^2经过椭圆C2:x^2/a^2+y^2/b^2=1(a>b>0)的两个焦点 1、求C2离心率2、设Q(3,b),又M、N为C1与C2不在y轴上的两个交点,若三角形QMN的重心在抛物线C1上,求C1、C2方程 两道不定积分题,谢拉!①∫[(3-x²)/(x³-x)]dx②∫[1/√(1+x²)]dx 关于x的多项式6x的n次方-1-4x+k-3多项式:(6)( x的)( n次方-1 )( -4x)( +k)( -3) 我用括号括起来,希望您能明白 x是多少 k是多少是二次二项式 奇异 神奇 惊奇怎么区分 已知集合A={ x|X^2 +px +q=0} B ={x | X ^2 -px -2q =0} 且A交B={-1} 求A并B 寒假趣事作文500字你发的够字数吗 设椭圆C1:x^2/a^2+y^2/b^2=1(a>b>0),抛物线C2:x^2+by=b^2(1)若C1经过C1的两个焦点,设椭圆C1:x^2/a^2+y^2/b^2=1(a>b>0),抛物线C2:x^2+by=b^2(1)若C1经过C1的两个焦点,求C1的离心率.(2)设A(0,b),Q(3倍根号3,5 天火同人卦--同人于野、亨、利涉大川、利君子贞.同人、柔得位、得中、而应乎干、文明以健、中正而应、君子正也、唯君子为能通天下之志.天与火、同人、君子以类族辨物. 海南寒假趣事作文500字 设二次方程x的平方-PX+15=0,x的平方-5x+q=0的解集分别为A,B 且A并B=2,3,5 A交B等于3 试求 A B P q 的重点 求 A B 的 值 101分之1减去102分之1的绝对值,加上102分之1减去103分之1的绝对值,加上103分之1减去104分之1的绝对值,加上104分之1减去105分之1的绝对值. 设x,y是关于m的方程m² -2am+6+a=0的两个实根,则(x-1)² +(y-1)²的最小值是? 设二次方程x²+px+15=0的解集为A,x²-5x+q+0的解集为B,若A∩B={3},求P,q的值及集合A∪B. 狗有什么奇异现象?具体说明些哦再给小一些,好吗 已知方程x²-px+15=0与方程x²-5x+q=0的解集分别为A与B且A∩B={3},则p+q的值为? 已知a,b是关于x的方程x^2-(2k+1)+2k(k+1)=0的两个实数根,则a^2+b^2的最小值是______________.把过程写下来,答案要不要无所谓.噢,SORRY ,我真的看错了= =.已知a,b是关于x的方程x^2-(2k+1)x+2k(k+1)=0的两个实数 问道高中地理题强化专练2.右图为“西半球侧视图”,若西半 球和夜半球完全吻合,完成下列要 求. (1)此时太阳直射点的地理坐标是 ;此时太阳直射点向南移,则北半球进入季.(2) It is our duty to keep our classroom clean and tidy.句中的 clean and tidy是什么成分?为什么? 当k________时,方程x²+(2k+1)x-k²+k=0有实数根; 问道高中地理地球的大气的题目中国气象局与交通部2006年10月15日联合发布全国主要公路气象预报:15日20时至16日20时,……内蒙古中部的部分地区有沙尘天气.土壤风蚀是沙尘暴发生发展的重 已知方程x²-px+15=0与方程x²-5x+q=0的解集分别为A与B且A∩B={3},则p+q的值为 观察蚂蚁搬家的作文快啊,今晚就得交 关于x的方程x^2-zx+1-15^0.5 i=0有实数根,求使得复数z 的模取到最小时方程的解 It is our duty to keep our classroom clean and tidy.中的It《our duty 》和 clean and tidy是什么成分 小学四年级观察蚂蚁搬家作文 月亮周围有光圈是什么现象?我的记忆没错的话 我们小时候的语文课本上说 月亮有光圈的话说明最近的天气会变坏 是要下雨还是怎么的~夏天的时候比较明显 已知方程 x²-Px+15=0与x²-5x+Q=0的解集分别为S和M,且S∩M={3},则P+Q是多少?请问3²-3p+15=0 我为什么算答案是2呢? 已知直线l的方程y=mx+m^2,抛物线C1的顶点和椭圆C2的中心都在坐标原点,且它们的焦点均在y轴上,当m=1时,直线l与抛物线C1有且只有一个公共点,求抛物线C1的方程 我国一艘远洋考察船,于北京时间2000年2月28日23时起,在赤道上由东十二区向东经过45小时航行了900海里,这时所在的地点的区时是(1海里 海里=1.852km) 答案为2000年3月1日1时答的好我给至少20分. 安顺三创英语作文 Keep our city clean中学 水平. 四年级关于观察蚂蚁搬家的作文 月亮周围出现一个光圈,是怎么回事?前天夜自习放学.独自一人走在路上,突然仰望天空,发现月亮周围出现一个光圈,不可思议呀.怎么回事,是不是超级月亮? 500字左右是正在放寒假 谁有关于观察蚂蚁搬家的作文,要说明文的哦! 9.国家大飞机制造项目落户上海,体现上海的突出区位优势是 ( )A.交通便捷 B.劳动力充足 C.消费市场大 D.科技力量强为什么不选A? 一2分之5十0.0864等于几 若x的6次方y的m次方/x的2n次方y的3次方/xy的平方与2x的立方y 的立方是同类项,求m的平方-25n的值 偶尔见到月亮周围有一个光圈,是什么现象? We should keep our classroom _______(clean). 观察蚂蚁搬家的作文怎么写 当前,我国进行西部大开发,目的是合理利用西部丰富的自然资源,使得西部地区经济社会较快发展,下列说法不正确的是( 我选B )A.西部大开发,促进了经济社会的发展,从而使环境承载力变大B.西 Waste paper should be throun every were,It's our duty to keep our city clean 蚂蚁搬家作文 已知椭圆E的长轴的一个端点是抛物线y²=4√5x的焦点 离心率是√6/3(三分之根六)求椭圆E的方程 翻译:You should keep out of our gurrd The students promise that they will keep their school clean同义句 月亮是黄色的,而且是圆的,还一会被乌云遮住,这是什么现象 暑假趣事作文800字 设x,y是关于m的方程m的平方-2am+a+6的两个实数根设x,y是关于m的方程 m的平方-2am+a+6=0的两个实数根,则(x-1)的平方+(y-1)的平方的最小值是多少? 月亮跟我走的现象如何解释 暑假趣事作文600~800字 若3x的平方y的n次方+(m-3)x是关于x、y的五次二项式,则m若3x的平方y的n次方+(m-3)x是关于x、y的五次二项式,则m( ) 求7月7日到7月24日(左右)都有什么特殊天体现象如题,特别是7月13日以后,都有什么典型的天象(如流星雨、行星的特殊位置等等),并且请告诉我那是怎么回事,有什么样的原因和现象,主要是 982.77 你懂得 qzrufang2012@sina.com 谢谢 已知方程x旳平方-px+15=0与x旳平方-5x+q=0旳解集分别为M、N,且M∩N={3},则q分之p=?
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘