C语言重拾(2)——位操作

第15章位操作

15.1 二进制数、位和字节

15.1.2有符号整数(补码和反码)

CPP书上先介绍的补码,一时间没有接受,仔细看了一遍,和很早之前学的一致。这也算明白了补码到底怎么来的,用9位的二进制数1 0000 0000(十进制的256)减去一个符号量负数的值。如1000 0001 (这个数的第7位是1,代表负数),然后用9位二进制数1 0000 0000-1000 0001=0111 1111,0111 1111就是十进制的127,所以代表-127。
反码表示规则为:如果是正数,则表示方法和原码一样;如果是负数,符号位不变,其余各位取反,则得到这个数字的反码表示形式。
补码是计算机表示数据的一般方式,其规则为:如果是整数,则表示方法和原码一样;如果是负数,则将数字的反码加上1(相当于将原码数值位取反然后在最低位加1)。
还是用上面的1000 0001(十进制-127)举例,首先数字127的原码为0111 1111,反码为1000 0000,补码为1000 0001
(饶了一大圈,其实还是简单加减法的问题,当然还是第二种最直观了)
具体例子可以参考这个链接 二进制原码、反码、补码详解

15.1.3 二进制浮点数

1.二进制小数

普通的浮点数0.527 表示为  5/10+2/100+7/1000
二进制小数.101表示为  1/2+0/4+1/8   十进制就是0.50+0.00+0.125=0.625
许多分数(如1/3 2/5)不能用二进制表示法准确表示,实际上,二进制表示法只能表示多个1/2的幂的和。

2.浮点数表示法

计算机要留出若干位(因系统而异)储存二进制分数,其他位储存指数。一般而言,数字的实际值是由二进制小数乘以2的指定次幂组成。
这个查阅了几个文章,写的还比较清楚,自己倒没有重点看,大体了解了一下原理。如:C语言中浮点数的表示方法
浮点数的二进制表示(IEEE 754标准)

15.2 其他进制

八进制很少用,大体过了一眼,十六进制在CAN中常用,进制暂无难点,略过。

15.3 C按位运算符

15.3.1 按位逻辑运算符

4个按位逻辑运算符都用于整型数据,包括char。按位逻辑运算的操作只针对每一个位,不影响左右两边的位,它与常规的逻辑运算不同,常规的逻辑运算操作的是整个值。

1.二进制反码或按位取反 ~

若val=2(二进制0000 0010),则~val=253(二进制1111 1101)

2.按位与 &

两个比较对象都为1时,结果才为1。(两位都真,结果才真)
(1001 0011)&(0011 1101)=(0001 0001)
C语言有一个运算符&=,其作用等效为:
val& = 0377;
val = val & 0377;

3.按位或 |

两个比较对象有1时,结果为1。全0才0。(其中一位有真,结果即真)
(1001 0011)|(0011 1101)= (1011 1111)
同理,|=用法与&=相同。下文的 ^= 也一样。

3.按位异或 ^

两个比较对象有1时(但不能是同时为1),结果为1。(有真有假,结果为真。真真,假假,均为假)
(1001 0011)^(0011 1101)= (1010 1110)

15.3.2 用法:掩码

在单片机里常用,比如 ch&0xFF 就是取ch的低八位,ch&MASK(MASK=00000010)就是只保留ch第1位的值,其他位置零。

15.3.3 用法:打开位(设置位)

flag = flag | MASK  (MASK=00000010)  则flag的1号位置1,其他位不变
给MASK换个数,令MASK=1011 0110,flag=0000 1111,则flag | MASK的结果为:(1011 1111)
MASK的1.2.4.5.7位为1,则flag的1.2.4.5.7位也为1,其他位保持原来数值不变。

15.3.4 用法:关闭位(清空位)

关闭位的操作是 flag &~ MASK

15.3.5 用法:切换位

切换位是指打开已关闭的位,或关闭已打开的位。可以使用(^)按位异或运算符 切换位。
令MASK=1011 0110,flag=0000 1111,MASK的1.2.4.5.7位为1,则flag的1.2.4.5.7位打开已关闭的,关闭已打开的,其他位不变,则结果为(1011 1001)。

15.3.6 用法:检查位的值

if(flag==MASK)  这种判断,即使flag的第1位为1,其他位也可能导致比较的结果为假
所以,采用 if((flag & MASK) == MASK)   先覆盖flag中的其他位,再判断特定位。

15.3.7 移位运算符

左移右移不做赘述(感觉又写的太乱了,BTW,就这样吧)

15.4 位字段

位字段不想打字了直接贴其他人的链接吧C语言位字段
(其中,位字段与按位运算符没有看,书上写的不鼓励那么做,日后再看吧,23333)
(C11还有对齐特性,也没看,23333)

这次就到这里吧,下次接着回到第4章学习,近期老师催促得厉害,还生了次病,一直没更新没学习啦,886

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值