【基础】二进制补码、异或运算、位移运算、对齐


一、进制补码(对于一个字节而言)

  二进制补码用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;

异或有什么神奇之处(应用)?

  1. 快速比较大小,判断a ^ b == 0效率将会更高.
  2. 我们可以使用异或来使某些特定的位翻转,因为不管是0或者是1与1做异或将得到原值的相反值,翻转10100001的第6位, 答案:可以将该数与00100000进行按位异或运算;10100001 ^ 00100000 = 10000001,不同为0,相同为1,所以与0异或不变,与1异或翻转,所以只用1就能实现翻转。
  3. 我们使用异或来判断一个二进制数中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新增了检查内存对齐要求的功能,而且可以指定比基本对齐值更大的对齐值。
  • 通常(但不总是),使用这些特性的程序仅限于特定的硬件平台或操作系统,而且设计为不可移植的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值