主要内容
1. 运算符:~ & | ^ >> << &= |= ^= >>= <<=
2. 二进制,十进制,十六进制计数法
3. 处理值中的个别位的2个工具:位运算符,位字段
二进制数1101–>1*2^0+0*2^1+1*2^2+1*2^3=13
一个字节通常包含8个位,将这8位从左到右看成7-0,位7称为高位,位0称为低位。该字节可保存的最大数是把所有位都设成1:11111111,得255,而最小的二进制为0,所以一个自己能储存的数的范围是0-255,共256个可能的值。unsigned char通常用一个字节来表示0-255,而unsigned char用一个字节表示-128到+127.
有符号整数
有符号的数表示方法是由硬件决定的,而不是C。或者保留高位来表示数的符号。10000001=-1;00000001=1。所以整个范围是-127到+127
而要对一个二进制补码取相反数即反转每一位然后+1,例00000001=1,所以-1=11111110+1
二进制计数法只能精确描述多个1/2的幂的和,3/4,7/8可被精确表示为二进制但1/3却不行。例0.625用二进制小数表示即为1/2+0/4+1/8=.101
C位运算符
C提供位的逻辑运算符和移位运算符
逻辑运算符
一、二进制反码或按位取反:~
表达式 ~(10011010)
结果 (01100101)
二、位与:&
二进制运算符&通过对两个操作数诸位进行比较产生一个新值。对于每个位,只有两个操作数的对应位为1时结果才为1
(10010011)&(00111101)//表达式
(00010001)//结果值
三、位或:|
二进制运算符|通过两个操作数逐位进行比较产生新值,对于每个位,如果其中任意操作数中对应位为1,则结果为1
(10010011)|(00111101)//表达式
(10111111)//结果值
四、位异或:^
对于每个位,如果操作数中的对应位中有一个为1(但是不都为1),那么结果为1
(10010011)^(00111101)//表达式
(10101110)//结果值
掩码
掩码是一串二进制代码对目标字段进行位与运算,屏蔽当前的输入位。
例:mask 00000011 & flag 10010110 –>00000010
掩码中的0覆盖了覆盖了flag中的对应位,该过程为“使用掩码”。
**位运算用法
- 打开位:任何位用 | 运算符与1组合结果为1.
- 关闭位:若想关闭某一位,但不改变其他位,假设想改变flag中的位1,设mask的位1为1,则flags=flags & ~mask即改变了flag的位1.可简写成flags&=~mask.
- 转置位:转置一个位即,若该位为打开(1),则变为关闭(0),反之。则flag^=mask即可
查看一位的值:若想判断flag的位1是否为1,简单用if(flag==mask)是不行的,因为其他位不能保证相等,所以需要屏蔽其他位,则需要:if((flag&mask)==mask)。应注意:1.位运算符优先级低于==,故要加上小括号。2.避免漏过界,位掩码至少应该与其所屏蔽的值具有相同的宽度。这里mask应为1000000(多少个0取决于flag位数)
移位运算符
1.左移:<<
将其左侧操作数的值的每位向左移动,移动的位数由右侧的操作数决定,空出的位用0补充,并且将移出的位丢弃。
例:(10001010)<<2//表达式
(00101000)//结果值
但此操作并不改变原数,<<=才会改变
2.右移同理
number<< n相当于number乘以2的n次幂
number>>n相当于number除以2的n次幂