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

位运算-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. 位域提供了一种手段,使得可在高级语言中实现数据的压缩,节省了存储空间,同时也提高了程序的效率。
乐观锁和悲观锁 你更钟情于哪一个? Apple索30%分成 iOS版微软SkyDrive更新搁浅 [简讯] Linux 3.7发布 开源图形卡驱动程序 高效敏捷的十大经验法则 佛瑞斯特资讯公司预测2013年云计算的十个变化 百会中小企业CRM年会成功举办 发布CRM选型指南 诺基亚创新体验中心NEIC训练团正式开班 新威胁:IE新漏洞允许网站跟踪鼠标 少编码多思考:代码越多 问题越多 [简讯] JDK 7u10发布 修复安全漏洞 搜狗茹立云:为何搜狗语音助手比Siri更精准? BlackBerry 10最终版SDK Gold发布 谷歌地图正式登陆App Store 为开发者推出SDK 你的云数据的三个最大威胁 公开叫板:Google不打算推出Win8版Gmail和Drive APP备案风波:开发者何去何从? 32位和64位的JVM 我该选择哪个呢? 黑莓“Got Game Port-a-Thon”活动将于12月22日在北京举行 专访Moti Joseph:浏览器安全的经验之谈 四大开源云平台的命运基因 FPS移动游戏:画质不是第一位,操控才是死穴 微软2013年的五个安全预测 应用成武器 王淮,大城小胖论辩HTML5 局部有小雨 技术人员创业后就不再适合继续编码了? Google Dremel vs Apache Hadoop 低功耗之争:英特尔 VS ARM NEIC-诺基亚体验创新中心 助力开发者创享新移动互联时代 Google地图主管Daniel Graf:新设计,新目标 浴火重生:OpenFeint创始人推开源平台OpenKit 紧随AWS数据仓库服务 Rackspace力鼎Cloudant 创业者谈:畏惧失败,但也要拥抱失败 用FLASHGET无法下载. 趁着各位斑竹到任,赶紧把几个悬而未决的问题提出来,呵呵! com+的调用方式 哪位大侠知道今年计算机等级考试二级C语言还是用Turbo C2。0吗?还是在Dos环境下吗?(100相赠) 关于多媒体定时器的问题,各位进来看看 session出的问题,高手请进来!! 请问,大连雅奇培训如何?请指点。。。。。。 怎样用header()做下载文件? 关于检测组合键的程序怎样写? 菜鸟问题!!!页面显示后台数据 请问软件包LEDA -- library of the data types and algorithms 哪里有下载的? 如何获得当前页面中的所有Textbox控件集合? 如何对两个表操作???谢谢! java的程序在写Dreamweaver 4里写完不可以直接用,是不是 打印的问题 DELPHI5的资源编辑器用起来很不爽,有没有好点的? 帮帮忙~~~~ 请问软件包LEDA 哪里有下载的?谢谢 ado连接远程数据库是以文件共享方式,还是c/s方式啊? 有没有工作的JAVA程序员吗? 简单的语法问题 vb还是不太会用 求教 最菜的问题 如何保存无法保存的网页? 只要每人献出一点爱,人人都能成为程序员 呵呵,又有问题了 苦恼,大家帮忙啊 关于声音处理的一个问题 求英文资料,急!!! 帮忙解释一下程序,谢谢:) 怎样实现这样的存储过程?高手快来! 用过websnap的进来看一下,巨简单! 调试版本与发布版本的区别? 急等答案, sql的基本表是用一个存储文件表示还是用若干个存储文件表示 我的Windows 2000有时无法关机(重起) ********通过编号找名称!*******求最快的方法!!! 格式化硬盘后安装WIN98过程中为什么出现蓝屏,继续安装下去连软件都安装不了? 请教一个让人郁闷的问题! 寻找一本人民邮电出版社出版的有关 GSM 网络优化的书 请问高手:能不能动态creatLayer? select * ????? 问候大家 晚上好 ,有个问题请教,立即给50分! 怎样使模式对话框最大化显示? 关于socket 十万火急,大哥大姐快救小弟一命!!!考高程的或考过的请帮忙,感激!!! 求救 跟帖 在SERVLET中,页面怎么跳转呢?客户端可以下载指定的ftp文件。。? 一个数据库连接问题??? 挂了双硬盘后,我的光驱不见了,请问怎么办?急!!!!!!!!!!!!!!!! 在SERVLET中,页面怎么跳转呢?客户端可以下载指定的ftp文件。。? 急急急急急! 寻求JB8+Weblogic7的配置! 质量为m的物块,系在弹簧的一端,弹簧的另一端固定在转轴上,弹簧的自由长度为L.劲度系数为K,使物块在光滑水平支持面上以角速度w作匀速圆周运动,则此时弹簧的长度为多少? 稀土怎么样才能开采? e t s a 可以组成什么单词 The hot tiles on the floor will melt your 稀土怎么开采 黑洞一个小时=地球多少年? 一个蚂蚁从5楼掉下1楼来为什么没有摔死?这是我很长时间搞不懂的问题啊.求救`` 稀土怎样开采 w t s e e 能组成什么单词 The ice started ( ) (melt) 稀土在开采过程中产生的负面影响是什么 黑洞存在了多少年?黑洞是随宇宙诞生一起诞生的吗? 蚂蚁为什么从高楼上跳下来不会摔死? 打对号题 a e t s组成什么单词 两股线绣的十字绣,半针应该用几股线… 打对号那题 e、t、a、t、s组成单词 十字绣中格的半针绣用几股线? 打对号的题,在线等 世界上有没有无血动物 "Melt down" What's Meaning? 打对号那道题4 将一个质量为M,边长为A的正方形均匀木箱放在粗糙水平面上将一个质量为m,边长为a的正方形均匀木箱放在粗糙水平面上,今用力推木箱使其绕一棱翻倒,求推力至少做多少功 答案是(根号2-1)m 某列车匀速前进,从驶上300米的桥到完全通过,一共用了1/3分钟,又知列车通过桥上一灯塔用时10秒钟,.某列车匀速前进,从驶上300米的桥到完全通过,一共用了1/3分钟,又知列车通过桥上一灯塔用时 十字绣怎么勾边?一般用几股线? 三个打对号的题, melt temperature是什么意思 1、如下图所示,质量为m的重锤从高h处自由下落,打在质量为M的木桩上,重锤与木桩一起下沉距离s.求木桩在下沉过程中遇到的平均阻力.(M+m)g+m^2gh/(M+m)s为啥? 在绣十字绣过程中, 地球离各个星球的距离? 英语翻译 有一种球从1.8米的高度自由落下后,第一次反弹的高度是1.5米,第二次反弹高度为0.9米,据此推理第三次弹起高度为()米 甲乙2石头,大小不同,石质相同.甲石质量1.5千克,体积4立方分米,乙石质量18千克,体积多少? 像蚂蚁一样不会摔死的动物急………………………………!摔不坏的东西也可以 比赛用的篮球,从1.8米的高度自由落下后,第一次反弹高度应( )1.2米,( )1.4米. 甲、乙两块石头,大小相同,石质相同.甲石头质量是1.5千克,体积是4立方分米.乙石头质量是18千克,体积是多少? 下载是什么意思 对的打对号,错的打错号并说明原因 甲乙两块石头,大小不同,石质相同,甲石头的质量是1.6千克,体积是4立方分米.乙石头的体积是40立方分米质量是多少? 蝎子毒还是蜈蚣毒? 判断的第四第五题打对号还是错号 我国公民全部政治生活的基础和准则(基本内容)是 down的意思 判断正误 对的打对号 错的打错号 我国公民暴雨政治生活的基本原则是什么 Bend down是什么意思快 请问:什么是二维码,具体怎么使用. 我养宠物的英文怎么说 顺便问一下,活S菌加活R菌, 怎么使用二维码?二维码是干什么用的? 日本地震到底死了多少人呢?拜托了各位 谢谢 关于用红细胞计数法测定活细菌数量的题目有人采用下列方法进行酵母菌的计数:将500个红细胞与5毫升该培养液混匀,然后制片观察,进行随机统计结果如下: 视野1 视野2 视野3 视野 什么是二维码?二维码有哪些新奇应用 十字绣用丝线绣好看还是用绵线绣好看以前只绣过一个钱包,听说丝线绣比较慢,这点倒没什么.丝线绣有哪些好处与坏处,请各位妹妹赐教 一个篮球从高出自由落下,每次接触地面后弹起的高度2/5.如果这个篮球从25米的高处落下.问:那么第三次弹起的高度是多少? 17岁,一米58正不正常? 为什么蚂蚁从高出掉下不会摔死? 球球从高处自由落下球从高处自由落下,触地面又弹起,每次弹起的高度都是下落高度的2/5,如果球从35米处落下,那第三次弹起的高度是多少 s e t w e 都能组成什么单词 急 朝鲜富人如何休闲?【组图】媒体称延迟退休多拿养老金偷换概念 犯罗援:两岸政治议题不能一拖再拖 有十黑龙江一公安局欠债18年不还 当地纪教科书作品付酬办法发布 文字作品每千土耳其隆重阅兵庆祝建国90周年监听事件对法美关系损害有限美国安局铁杆盟友临阵“倒戈” 称反对意大利前总理:欧洲为配合反恐对美国监埃及武打冠军因支持前总统穆尔西 金牌杭州滨江16所公办学校体育设施免费向台湾空姐酷似林依晨网络走红 海量清纯外媒关注习近平全面深化改革“总体部署意大利总理莱塔会见王毅美国就中国解密核潜艇部队表态中国核潜艇官兵趣闻:自称烧锅炉 1瓶日媒称两艘中国军舰通过冲绳附近毗连区韩雪宣传新片遭裸男突袭 吓得脸色苍白美国家安全局否认收集欧洲电话记录 称美国安局铁杆盟友临阵“倒戈” 称反对永康68岁大爷得乳腺癌 百例患者中就C罗进球来得太晚了天一家博会11月盛势登场老兵父亲走了,大哥你在哪儿360手机卫士用户数量和市场份额占绝谷歌启动连接世界战略 将新版安卓推向碧桂园清泉城精装小复式变身“钱袋子”史学家张海鹏:研究历史是非常严肃的事提拉米苏旗舰店医生需要的不仅是理解更是信任鹏博士云管端平台打造成都“100M宽最新优惠三环路外涨水了?别急,只是应急演练不要片面强调个人兴趣 专业不服从调剂今日时间表吃油要多样 认准1∶1∶1脂肪酸均衡硅谷子日赚9.26%逆袭居首苏亚雷斯魔神之间火热团购小组赛最佳11人尚善、好灶头自行拆违 城管拍照取证再续南粤家电传奇 广州国美12周年庆
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘