一、进制补码(对于一个字节而言)
二进制补码用1字节中的后7位表示0~127,高阶位设置为0。目前,这种方法和符号量的方法相同。另外,如果高阶位是1,表示的值为负。
这两种方法的区别在于如何确定负值。从一个9位组合100000000(256的二进制形式)减去一个负数的位组合,结果是该负值的量。
例如,求10000001的真值:
- [ 1 ] 第一步确定正负,由于最高位为1则是负的
- [ 2 ] 第二部确定符号常量,用100000000-10000001=01111111=127
- [ 3 ] 组合成真值为:-127
注意二进制补码范围是:-128~+127
二、异或运算及用途
相同为0,不同为1
例如,求10010^10001的值为:00011;
异或有什么神奇之处(应用)?
- 快速比较大小,判断
a ^ b == 0
效率将会更高. - 我们可以使用异或来使某些特定的位翻转,因为不管是0或者是1与1做异或将得到原值的相反值,翻转10100001的第6位, 答案:可以将该数与00100000进行按位异或运算;10100001 ^ 00100000 = 10000001,不同为0,相同为1,所以与0异或不变,与1异或翻转,所以只用1就能实现翻转。
- 我们使用异或来判断一个二进制数中1的数量是奇数还是偶数,异或具有交换律,所以判断101001中的1是奇数还是偶数,只用看:1 ^0 ^ 1 ^ 0 ^ 0 ^ 1的最终结果是1还是0,因为其具有交换律,所以 1 ^0 ^ 1 ^ 0 ^ 0 ^ 1=1 ^ 1 ^ 1 ^ 0 ^ 0 ^ 0 =1 ^ 1 ^ 1 = 1 ^ 0 = 1;因此结果是0就是偶数个,结果为1就是奇数个
c其它
:详细链接:
三、位移运算
1.左移<<
左侧运算对象移出左末端位的值丢失,用0填充空出的位置。下面的例子中,每一位都向左移动两个位置:
(10001010) << 2 // 表达式
(00101000) // 结果值
2.右移>>
右移运算符(>>)将其左侧运算对象每一位的值向右移动其右侧运算对象指定的位数。左侧运算对象移出右末端位的值丢。对于无符号类型,用0 填充空出的位置;对于有符号类型,其结果取决于机器。空出的位置可用0填充,或者用符号位(即,最左端的位)的副本填充:
(10001010) >> 2 // 表达式,有符号值
(00100010) // 在某些系统中的结果值
(10001010) >> 2 // 表达式,有符号值
(11100010) // 在另一些系统上的结果值
------------------------------------------------
下面是无符号值的例子:
(10001010) >> 2 // 表达式,无符号值
(00100010) // 所有系统都得到该结果值
每个位向右移动两个位置,空出的位用0填充。
3.用法:移位运算符
移位运算符针对2的幂提供快速有效的乘法和除法:
number << n number乘以2的n次幂
number >> n 如果number为**非负**,则用number除以2的n次幂
4.对齐:
未完待续
总结
- C 区别于许多高级语言的特性之一是访问整数中单独位的能力。该特性通常是与硬件设备和操作系统交互的关键。
- C有两种访问位的方法。一种方法是通过按位运算符,另一种方法是在结构中创建位字段。
- C11新增了检查内存对齐要求的功能,而且可以指定比基本对齐值更大的对齐值。
- 通常(但不总是),使用这些特性的程序仅限于特定的硬件平台或操作系统,而且设计为不可移植的。