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

位运算-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. 位域提供了一种手段,使得可在高级语言中实现数据的压缩,节省了存储空间,同时也提高了程序的效率。
水落石出:在与谷歌苹果竞购创业公司中微软胜出 用扁平化的界面设计吸引用户 2012年12月份全球主流浏览器市场份额排行榜 冲榜不一定要刷榜:增加游戏曝光度的7大杀手锏 科技vs政治:FTC对Google的反垄断调查结束背后 威胁百度:奇虎360确认将与谷歌达成合作关系 Facebook更新Messenger应用 推免费网络电话服务 网上疯传iOS7概念设计:Dashboard是真是假? 过时的UI设计 Ubuntu手机系统前途不被看好 三星将于今年发布Tizen设备 将对苹果形成威胁? 分享9条经典的编程语录 国际著名黑客大赛介绍与比较 微软Azure CDN服务全球范围内出现宕机 双向多功能U盘:从Android设备到PC还有多远? 证明了自己:微软Win8获美国防部6.17亿订单 2013 Facebook黑客杯报名即将开始 解决Win8下IE10无法打开的故障 [简讯] Scala 2.10.0发布! 收购传闻:Apple一厢情愿还是Waze待价而沽 回顾过去,展望2013:移动开发引擎、工具和语言盘点 成本为0!Netflix开源工具Janitor Monkey清理AWS iOS开发者讲述在Google工作的三个月 GitHub历史上最糟糕宕机事故回放及反省 疑因竞争 谷歌有意让地图与WP手机不兼容 移动游戏开者必看:海外VC最关心什么? 淘宝UED:随侃设计师的个人素养 TIOBE 2013年1月:不负重望 Objective-C再次赢得桂冠! 大数据:商业或技术的挑战? 开源移动统计:Cobub Razor近期版本大升级 无人机应用,为何屡遭苹果拒绝 2013年Java继续火的五大理由 请问 vb 怎么样让函数返回一个二维数组?能给你例子吗? 有人知道上海通方信息系统有限公司吗?我要去面式了?大家帮帮忙,做ejb程序员。 域问题 转分 介绍制作DLL专业书籍 有关image的函数问题 请教? TObject和integer之间的转换问题 数据库简单问题 文本文件的最后一行怎末去掉换行符,用程序实现。 善良的程序员,当心QQ骗子啊! 谁有Qamonitor,小弟急用! 不要笑偶 转分 有会打印对象编程的吗?printer对象怎样打印横线??怎样打印带风格的报表?? 表分区的数量有上限吗 ASP 0178 (0x80070005) 各位高人,请一定帮个忙吧 !! SetCellImage 利用C# 读取系统当前进程的出现问题,帮忙!! 请教高手:怎样在一个窗口里能够输入文本文件(按回车键) 另一个窗口显示出同样的文本 高手在何方 (大力请进)sql字符串处理的问题 上哪能下到exchange 2000,下到马上给分! ado问题? 数据迁移问题??? 怎么把列名选出来? [在线求助]:有什么好的方法可以使得鼠标放上有链接的地方状态栏不显示真实地址? 高手在哪!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 各位大哥﹐何為微创软件开发管理﹖﹖﹖﹖ 3com switch 3300 xm 有网管的功能吗? 关于窗口大小的问题,快来捡分~~~ 为什么2001年前的提问的问题、得分的问题、信誉分变化纪录都不见了。 无法在人才频道上提交简历。。。 请问:wsad4支持滚轮鼠标的插件哪里有下载??? 自动锁定计算机? 请问如何终止一个正在运行的应用程序 无法在人才频道上提交简历。。。 后面数据库为ms sql server2000的时间问题? DoEvents 怎么用?(不好意思,只有这么多分了!) CSDN真让我失望,大家都喜欢回答无聊的问题(不要回复) jdbc中LIKE条件如何使用prepareStatement? 请问,如果想报考系分的话,需要先过高程吗? 请问怎么把Excel形式的表结构导入到Oracle … 请问数据窗口中如何自动记录资料修改的帐户? 我倒要看看谁有本事让javac输出这样的信息? ADSL 可以直联吗? linfeng1216 (林枫) 请来领分。 在java中的暴露事件如何处理? 求PowerDesigner电子书籍资料!急! 有关_SERVER["HTTP_CONNECTION"] 求止战之殇的伴奏 一下事件按什么顺序排列更符合逻辑?53.(1)众人称赞(2)被捕入狱(3)痛改韵非 (4)人室盗窃(5)刑满释放A.4—2—3—5—1 B.2—4—3—5—1C.2—4—5—3—1 D.4—2—5—3一l 逻辑的力量怎么样 几个句子的发音困难!我在练口语,模仿磁带时就是听不出that怎么读,例如,It was generally supposed that it would not happen again.It is expected that the weather will be good soon.还有,We couldn't afford to keep our car,so we 甲队和乙队共修一条公路,甲队修了全长的百分之60,比乙队多修60米,这条公路长多少米? 逻辑中真包含关系与真包含于关系的区别逻辑推理确实难推敲啊 什么是特征音程? 初中七年级信息技术开学的第一节课要怎么上~ 与、或逻辑具备什么特性 甲乙丙修一条公路,路程比是8比7比5,他们按所修路程派劳动力,丙没派,但需付1350元,这样甲派60人,乙接上文:40人,甲乙各分多少元 已知函数f(x)=x^3-x在(0,a]上递减,在[a,+∞)上递增,求a的取值范围. 思维是什么?如何拥有“逻辑”? 谁能解释一下止战之殇这首歌 音程解决5 升1怎么解决?不是应该向外解决吗?是5 3还是3 3还是别的? 七年级学生入学要做到哪些? 英文翻译,冯友兰的《中国哲学简史》里的一句话The first to do so was Ssu-ma T'an (died HO B.C.), father of Ssu-ma Ch'ien (I45~ca. 86 B.C.), and the author with him of China's first great dynastic history, the Shih Chi or 甲乙丙三村合修路三村修路比8:7:5三村按修路派劳动丙没派劳动付甲乙1350元甲派60人乙40人甲乙各分多少元 已知函数f(x)=x^2(x-a)在区间(0,2/3)内单调递减求a的取值范围 现在还有大公无私的人吗? 甲乙丙三村修路程比是8:7:5因丙村无法派出劳动力,需要给甲乙两村1350元这样甲派了60人,乙派了40人,求甲乙两村各应分多少元? 香港割让后的情景有没有一本书,或是电影,描写一百多年前香港刚刚被割让给英国时,香港民众的反应或是当时的情景的?比如说英国是怎样对待当时的香港民众的,或是香港的生活状况 人是大公无私的吗? 音程是什么? 割让香港岛给香港带来的影响 数学题面积计算-小学题数学题面积计算 一个面积为70平方米的空间,使用一种280*80cm(厘米)面积的地砖铺设!请问有使用多少块呢? 音程的表现 意义 8米旗杆用几号国旗 鸿门宴中的 扬子江的介绍是什么, 经过三点《2,2》 《5,3》《6,0》的圆的方程 哎 那我想问的是2013年全国大学生英语竞赛初赛的笔试是 包括单选,阅读理解,完形等等和平常一样吗 什么的扬子江 圆面积计算如图,半圆的直径AB为2,AC垂直AB于A,BD垂直AB于B且AC=1,BD=3,P为半圆上任意一点,则封闭图形ABDPC面积最大为—————— 鸿门宴中的问题刘邦亲赴鸿门宴的主要原因是什么?显示刘邦什么养的性格特点?鸿门宴上活跃着很多人,请概括分析一下作者是怎样表现这些人物的?效果怎样? 止战之殇描述的是什么? 圆形面积计算一个圆形面积之比是9:1,直径之比是多少? 精英聚集的地方 用英语怎么说我要做一张关于培训的海报.需要加上这个短语的英文.不要百度翻译.求最地道的说法 求歌曲 女的唱的 非摇滚 歌词里边有you hope to find me i'm sorry but i can help you求歌曲 女的唱的 非摇滚 歌词里边有you hope to find me i'm sorry but i can help you 果园里桃树占总树数的1/3,李子树占总树数的1/9,其余的是苹果树.写出这个果园的桃树和李子树的棵树比. 鸿门宴 . 数学面积计算在下图中,平行四边形ABCD的边长BC长10cm,直角三角形ECB的直角边EC长8cm,已知阴影部分的总面积比三角形的面积大10平方厘米,求平行四边形ABCD的面积.对不起!是比三角形EFG的面积 果园里桃树的棵数占果树总数的3/2,李子树的棵数占果树总数的9/1,其余的是苹果树.写出这个果园的桃树和李子树的棵数比 关于赞美大公无私精神的人的古诗 张家港扬子江石化有限公司,简称“扬子江石化”这个单位怎么样?如题:张家港扬子江石化有限公司,简称“扬子江石化”这个单位怎么样,待遇情况,越详细越好,要我下周去面试,应聘的是中控 大棚蔬菜种植可以一起栽种的蔬菜搭配有哪些? "中国国际女排精英赛"译成英文怎么说? 直译 果园里有桃树三分之八亩,苹果树六分之十三亩,李子树八分之十五亩,请问该果园有多少亩, 独一无二的反义词是什么 周杰伦的{止战之殇}是什么意思啊 当当问:“香港割让给英国是永久割让吗?” 独一无二的反义词是什么啊 一个言字旁一个沈的右半边读什么 Did you know?How many time have you been late for school?(合并为一个宾语从句)怎么改有提示 Did you know how many times ____ ____ ____ late for school? 独一无二的反义词是什么? 求三个数学小故事!急只要三个,不许多,不许少 科学发展对人类的利大于弊还是弊大于利(原因)(辩论) 独一无二的反义词?1.独一无二的反义词2.填字成词.心悦( )( ) 久负( )( ) 故交通之利,不若扬子江与珠江也.意思快噢~ The world's most pitiable the! Is forever Only Love you apromise 迪拜将推专供叫车服务的出租车斯里兰卡近百年来首条新铁路动工印度驻马尔代夫高专汽车被砸维也纳童声合唱团主席:期待中奥合作促日本儿童人口持续减少 财务省提议裁减美女不顾反对捐肾给陌生男子 3年后携忧6岁儿未来买不起房 男子买411万泰国前总理阿披实被控谋杀 或助推通过全球首次大规模男性裸体展 法国美术展美国西南部遭遇强风沙尘天气 当地交通德国男子以点燃自家公寓要胁 欲与市长日本前首相小泉或与社民党党首联手反对母亲巧手变装 入睡孩童变身探索天使(俄罗斯将发行索契冬奥会纪念钞 面值1日本首相每日行踪遭媒体公开 前防卫相忧6岁儿未来买不起房 男子买411万德联盟党与社民党首轮谈判未能就预算问德一男子以点燃自家公寓相威胁 要求与母亲巧手变装 入睡孩童变身探索天使(泰国前总理阿披实被控谋杀 或助推通过四条眼镜蛇警戒盘绕婴儿身 “守护”其唐代某官员被免职原因:“惧内”之名传普京:西方制裁将像回旋镖一样打击欧盟奥巴马: G20国家须一起刺激全球经24小时要闻TOP10:政府每年让利曝德赫亚受伤休战一个月 曼联或签约巴1955年授衔之前许世友曾挂的另一军吉尔吉斯斯坦孔子课堂揭牌 旨培养会中荷兰华人生命科学协会年会研讨抗癌新进郑州于庄自建房坍塌现场找到12人 相港交所完成沪港通启动前最后系统准备测曹格盼生第三胎 不愿儿女当童星:做回纪录片《守望者》获意大利国际防务电影田间直达餐桌 通辽市农牧业标准化生产德甲联赛场均上座人数全欧第1 中超联美媒:中国低调持之以恒 从反美转向后2014加拿大·中国西藏文化周落幕 某部战士困难时期挖野菜 领导令不准与张祖林:现在特色化做得不好的要数昆明昆明高校“热得快”屡禁不止 开水房供寒假学生火车票11月14日开售曲一中校运会炫酷耍帅呆萌(图)
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘