c语言二进制数表示_C语言位操作

0cc58aa454a629338f4f72a688a2b11c.gif

了解位的基本概念

熟悉二进制数的运算方法

掌握各种位运算的方法和技巧

熟悉位段的基本概念

掌握位段中数据的引用方法

掌握数值的转换方法和技巧

C语言区别于其他语言的重要特点是支持位运算,使其能够完成汇编语言所能完成的大部分功能。在实际的编程中借助与位运算往往可以设计出简洁的算法,使程序简化,并且获得较高的效率。另外,某些对硬件进行控制的编程中,位运算也是必不可少的。

位运算应用于整型数据,即把整型数据看成是固定的二进制序列,然后对这些二进制序列进行按位运算。与其他的高级语言相比,位运算是C语言的特点之一,在实际应用中可逐步体会其优越性。

二进制就是逢二进一,比如十进制数3转换为二进制数11,十进制数10转换为二进制数1010。要把二进制数转换为十进制数,可以使二进制数字的每一位对应一个2的某次幂,然后累加求和。

我们把二进制数中的每一个二进制数称为位(bit,比特),每个0或1就是一位,位是数据存储的最小单位。

通常,我们把一组4位二进制数称为半字节(nibble),一组8位二进制数称为一个字节(byte)。通常把两个或者4个字节称为一个字(word),两个字又称之为一个双字(double word)。

为了简单起见,这里以一个字节为例,来说明无符号数和有符号数。需要注意的是:在Microsoft Visual C++ 6.0中,整型int用4个字节32位表示一个有符号整数。

位或运算符

按位异或运算符

按位取反运算符

左移运算符

右移运算

位复合赋值运算符

按位或运算是让参与运算的两个数对应的二进制位分别相或。只要对应的两个二进制位有一个为1,结果就为1;只有当对应的两个二进制位的数都为0时,该位的运算结果才为0.。

按位异或运算是让参与运算的两个数对应的二进制位分别相异或,当两个对应的二进制位不同时,结果为1,两个对应的二进制位相同时,结果为0。

按位异或运算的主要应用:

1. 使特定位翻转。

2. 与0按位异或,保留原值。

3. 交换两个值,不需要临时变量。

按位取反运算符为单目运算符,运算对象就置于运算符的右边,具有右结合性。其功能是把运算对象的内容按位取反,即1变为0,将0变为1。例如~9的运算表示为:

~(00001001)

结果为:11110110

左移运算用来把“<

int  a=8,b;

b=a<<3;

用二进制表示运算过程如下:

a:     00001000  (a=8)

b=<<3: 01000000  (b=64)

右移运算符用来把“>>”左边的运算数的各二进制位全部右移若干位,移动的位数由“>>”右边的数字指定。右移时,低位移出的二进制数舍弃,左端移入的二进制数分两种情况:对于无符号整数和正整数,高位补0,对于负整数,高位补1,这是因为负数在机器内均用补码表示。

例如:

int  a=15;

a>>2;

表示把00001111(十进制15)右移2位后变为00000011(十进制3)。

右移时要注意符号位,对于有符号的数,右移时符号位将一同移动。当为正数时(符号位为0),最高位补0;为负数时(符号位为1),最高位是补0还是补1取决于编译系统的规定。有的系统移入0,有的系统移入1,移入0的称为“逻辑右移”,即简单右移。移入1的称为“算术右移”。

位运算符与赋值运算符可以组成复合赋值运算符,如:

&=,|=,>>=,<<=,^=

例如:a|=b相当于a=a|b,a>>=b相当于a=a>>b。

由前可知,位运算的对象可以是整型和字符型数据,当两个运算数类型不同时位数也不同,此时,系统将自动进行处理:先将两个运算数右端对齐,然后,再将位数短的一个运算数往高位扩充,即:无符号数和正整数左侧用0补全;负数左侧用1补全,然后对位数相等的这两个数,按位进行运算。

位段的定义

位段中数据的引用

位段定义的一般形式为:

struct 位段结构名

{位段列表};

其中“位段列表”的形式为:  类型说明符  位段名:位段长度

位段变量的说明与结构体变量说明的方式相同。可采用先定义后说明、同时定义说明或直接说明这三种方式。例如:

struct  dz

{

unsigned  a:3;

unsigned  b:2;

unsigned  c:2;

}data;

其中位段a占3位,位段b占2位,位段c占2位。

位段中数据引用的一般形式:    位段变量.位段成员

例如:data.a=3;

说明:

位段成员的类型只能是unsigned或int类型。

一个位段必须存储在同一个存储单元中,不能跨两个单元。即如果一个单元空间不能容纳一个位段,则该空间不用,而从下一个单元起存放该位段。也可以有意使某位段从下一单元开始存放。

由于位段不允许跨两个字节,因此位域的长度不能大于一个字节的长度,也就是说不能超过8位二进制位。

可以定义无名位段,这时它只用来作填充或调整位置,无名的位段是不能够使用的。

位段的长度不能大于存储单元的长度,也不能定义位段数组。

位段可以用整型格式符输出,也可以用%u、%o、%x等格式输出。

位段可以在数值表达式中引用,它会被系统自动转换为整型数。

6c1da77eae2b41ac1091cff5dc0145a3.png

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值