• 原码、反码、补码及位操作符,C语言位操作详解

    计算机中的所有数据均是以二进制形式存储和处理的。所谓位操作就是直接把计算机中的二进制数进行操作,无须进行数据形式的转换,故处理速度较快。

    原码、反码和补码

    位(bit)是计算机中处理数据的最小单位,其取值只能是 0 或 1。

    字节(Byte)是计算机处理数据的基本单位,通常系统中一个字节为 8 位。即:1 Byte=8 bit。

    为便于演示,本节表示的原码、反码及补码均默认为 8 位。

    准确地说,数据在计算机中是以其补码形式存储和运算的。在介绍补码之前,先了解原码和反码的概念。

    正数的原码、反码、补码均相同。

    原码:用最高位表示符号位,其余位表示数值位的编码称为原码。其中,正数的符号位为 0,负数的符号位为 1。

    负数的反码:把原码的符号位保持不变,数值位逐位取反,即可得原码的反码。

    负数的补码:在反码的基础上加 1 即得该原码的补码。

    例如:
    +11 的原码为: 0000 1011
    +11 的反码为: 0000 1011
    +11 的补码为: 0000 1011

    -7 的原码为:1000 0111
    -7 的反码为:1111 1000
    -7 的补码为:1111 1001

    注意,对补码再求一次补码操作就可得该补码对应的原码。

    位操作符

    语言中提供了 6 个基本的位操作符,如表 2 所示。

    表 2 C语言运算符
    运算符 功 能 运算规则
    & 按位与 对应位均为 1 时,结果才为 1
    | 按位或 两位中只要有一位为 1,结果为 1。
    只有两位同时为 0 时,结果为才为 0。
    ^ 按位异或 两位相异时,结果为 1;两位相同时,结果为 0。
    << 左移 将运算数的各二进制位均左移若干位,高位丢弃(不包括 1),低位补 0,每左移一位,相当于该数乘以 2。
    >> 右移 将运算数的各二进制位均右移若干位,正数补左补 0,负数左补 1,右边移出的位丢弃。
    ~ 按位取反 0 变 1,1 变 0。

    注意,计算机中位运算操作,均是以二进制补码形式进行的。

    按位与(&)

    只有两位同时为 1 时,结果才为 1;只要两位中有一位为 0,则结果为 0。用式子表示为:

    0 & 0 = 0
    0 & 1 = 0
    1 & 0 = 0
    1 & 1 = 1

    复合赋值运算符:&= 表示按位与后赋值。

    例如,计算 20 和 9 按位与的结果,如下所示。


更多...

加载中...