C语言学习记录:按位操作

位编号和位值

有符号整数

如何表示有符号整数取决于硬件,而不是C语言。也许表示有符号最简单的方式是用1位储存符号。只剩7位表示数字本身(假设用1字节存储数据)。这种符号量(sign-magnitude)表示法,10000001表示 -1,00000001表示 1 。表示范围为 -127 ~ 127 (1+2+4+8+16+32+64=127)

二进制补码(two's-complement)

还是以1个字节为例子。   

二进制补码用 1 字节的后 7 位表示 0~127 ,高阶位设置为 0 。

如何确定负值?

从一个 9 位组合 1 0000 0000 (256的二进制形式)减去一个负数的位组合,结果是该负值的量。

假设一个负值的位组合是 1000 0000 ,作为一个无符号字节,该组合表示 128 ;作为一个有符号值,该组合表示负值(编码7的位为1),而值为 1 0000 0000 - 1000 0000 = 1000 0000,即128。因此,该数是 -128(在符号量表示法中,该位组合表示 -0)。类似:1000 0001 表示 -127,  1111 1111 是 -1 。该方法表示范围 -128 ~ 127  。

二进制补码的相反数:最简单的方法是反转每一位,然后加 1 。因为 1 是 0000 0001 ,那么 -1 则是 1111 1110 + 1 (1111 1111)  。

二进制反码(one's-complement)

通过反转位组合中的每一位形成一个负数。例如: 0000 0001 是 1,那么 1111 1110 是 -1 。这种方法也有一个 -0:1111 1111 。该方法能表示 -127 ~ +127 之间的数。


二进制浮点数

二进制表示法只能精确的表示多个 1/2 的幂的和。

.101 表示为 1/2 + 0/4 +1/8 = 0.625


按位逻辑运算符

符号功能
~按位取反或二进制反码
&按位与
|按位或
^按位异或(相同为0,相异为1)

掩码(mask)

所谓掩码是指的一些设置为开(1)或关(0)的位组合。

  • 打开位
  • 关闭位
  • 切换位
  • 检查位的值

单片机编程用烂了,不解释。

移位运算符

符号功能
<<左移,末端补0
>>

右移,无符号类型末端补0。

有符号类型,可用0补充,可用符号位副本补充。(具体系统分析)


版权声明:本文为qq_41650023原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。